golang context 与 sync.WaitGroup

文章目录 (?) [+]

    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
    本文链接:https://www.lanseyujie.com/post/golang-context-and-sync-waitgroup.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0