package main import ( "context" "fmt" "sync" "time" ) var ( key = "name" wg sync.WaitGroup ) func watch(ctx context.Context) { // 计数器加一 wg.Add(1) for { select { case <-ctx.Done(): // 计数器减一 wg.Done() fmt.Println(ctx.Value(key), "停止") return default: fmt.Println(ctx.Value(key), "goroutine 监控中...") time.Sleep(2 * time.Second) } } } func main() { // 调用 cancel 方法将会通知所有以 ctx 为基础的上下文退出 ctx, cancel := context.WithCancel(context.Background()) go func() { // 传递参数 valueCtx := context.WithValue(ctx, key, "监控 1") watch(valueCtx) }() // 到相对时间点后停止 ctx1, _ := context.WithTimeout(ctx, time.Second*3) go func() { valueCtx := context.WithValue(ctx, key, "监控 2") watch(valueCtx) }() // 到绝对时间点后停止 ctx2, _ := context.WithDeadline(ctx, time.Now().Add(time.Second*6)) go func() { valueCtx := context.WithValue(ctx, key, "监控 3") watch(valueCtx) }() time.Sleep(10 * time.Second) fmt.Println("通知停止所有监控") cancel() // 等待计数器清零 wg.Wait() }
本文标题:golang context 与 sync.WaitGroup
版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。