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