【Go语言核心手册11】context.Context

往期精选(欢迎转发~~)

11.1 内容前导

回顾之前的知识,我们先看一个关于WaitGroup的示例:

func main() {
      var wg sync.WaitGroup    wg.Add(2)    go func() {
          time.Sleep(2*time.Second)        fmt.Println("1号完成")        wg.Done()    }()    go func() {
          time.Sleep(2*time.Second)        fmt.Println("2号完成")        wg.Done()    }()    wg.Wait()    fmt.Println("好了,大家都干完了,放工")}

示例比较简单,main协程等待两个goroutine的结束。如果是希望主协程关闭,通知goutoutine关闭,我们可以使用select + chan的方式:

func main() {
      stop := make(chan bool)    go func() {
          for {
              select {
              case <-stop:                fmt.Println("监控退出,停止了...")                return            default:                fmt.Println("goroutine监控中...")                time.Sleep(2 * time.Second)            }        }    }()    time.Sleep(10 * time.Second)    fmt.Println("可以了,通知监控停止")    stop<- true    //为了检测监控过是否停止,如果没有监控输出,就表示停止了    time.Sleep(5 * time.Second)}

这种chan+select的方式,是比较优雅的结束一个goroutine的方式,不过这种方式也有局限性,如果有很多goroutine都需要控制结束怎么办呢?如果这些goroutine又衍生了其他更多的goroutine怎么办呢?如果一层层的无穷尽的goroutine呢?这就非常复杂了ÿ

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值