add context example
This commit is contained in:
parent
28e607a8e8
commit
b79a9b98f3
45
go/context.go
Normal file
45
go/context.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
// from
|
||||||
|
// https://www.ardanlabs.com/blog/2019/09/context-package-semantics-in-go.html
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// Set a duration.
|
||||||
|
duration := 150 * time.Millisecond
|
||||||
|
|
||||||
|
// Create a context that is both manually cancellable and will signal
|
||||||
|
// cancel at the specified duration.
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), duration)
|
||||||
|
defer cancel()
|
||||||
|
|
||||||
|
// Create a channel to receive a signal that work is done.
|
||||||
|
ch := make(chan string, 1)
|
||||||
|
|
||||||
|
// Ask the goroutine to do some work for us.
|
||||||
|
go func() {
|
||||||
|
|
||||||
|
// Simulate work.
|
||||||
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
ms := rand.Intn(300)
|
||||||
|
time.Sleep(time.Duration(ms) * time.Millisecond)
|
||||||
|
|
||||||
|
// Report the work is done.
|
||||||
|
ch <- "123"
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Wait for the work to finish. If it takes too long, move on.
|
||||||
|
select {
|
||||||
|
case d := <-ch:
|
||||||
|
fmt.Println("work complete", d)
|
||||||
|
|
||||||
|
case <-ctx.Done():
|
||||||
|
fmt.Println("work cancelled")
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user