关于golang的context控制协程的例子 - Go语言中文社区

关于golang的context控制协程的例子


关于context的概念,可以参考http://www.flysnow.org/2017/05/12/go-in-action-go-context.html
协程间的通信方式
1.共享变量(需要注意资源竞争,一般用互斥锁)
2.chan
3.context
以下是context的代码例子

package main

import (
    "sync"
    "fmt"
    "time"
    "context"
    "math/rand"
)

func test1(wg * sync.WaitGroup, ctx context.Context, cfunc context.CancelFunc){
    defer wg.Done()
    fmt.Println("test1 run")
    d := time.Duration(rand.Intn(10))
    fmt.Printf("%d 秒之后,test1 将终止n", d)
    time.AfterFunc( d * time.Second, cfunc)
    for{
        select {
        case <-ctx.Done():
            fmt.Println("test1 return")
            return
        default:
            fmt.Println("default")
            time.Sleep(1 * time.Second)

        }
    }
}

func test2(wg *sync.WaitGroup, ctx context.Context, cfunc context.CancelFunc){
    defer wg.Done()
    fmt.Println("test2 run")
    d := time.Duration(rand.Intn(10))
    fmt.Printf("%d 秒之后,test2 将终止n", d)
    time.AfterFunc( d * time.Second, cfunc)
    for {
        select {
        case <-ctx.Done():
            fmt.Println("test2 return")
            // 这里要不用return 要不就用break + lebal, 不能直接用break,只用break,这里只跳出case
            return
        default:
            fmt.Println("test2 default")
            time.Sleep(1 * time.Second)
        }
    }
}

func main() {
    wg := sync.WaitGroup{}
    rand.Seed(time.Now().UnixNano())
    ctx, cancel := context.WithCancel(context.Background())
    wg.Add(2)
    timeStart := time.Now().Unix()
    go test1(&wg, ctx, cancel)
    go test2(&wg, ctx, cancel)
    wg.Wait()
    timeEnd := time.Now().Unix()
    fmt.Printf("运行时长为:%d sn", timeEnd - timeStart)
    fmt.Println("主协成退出!")
}

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/f24cf1f78f63
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:08:15
  • 阅读 ( 1227 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢