为了账号安全,请及时绑定邮箱和手机立即绑定

上下文包 vs 完成通道以避免 goroutine 泄漏

上下文包 vs 完成通道以避免 goroutine 泄漏

Go
眼眸繁星 2023-06-01 18:08:50
有两种不同的方法来清理 goroutine。使用 kill channel 表示取消,使用 done channel 表示 goroutine 已经终止。type Worker struct {  Done chan struct{}  Kill chan struct{}  Jobs chan Job}func (w *Worker) Run() {  defer func() {    w.Done <- struct{}{}  }  for {    select {    case <-w.Kill:      return    case j := <-w.Jobs:      // Do some work  }}go w.Run()w.Kill <- struct{}{}用于context取消type Worker struct {  Ctx context.Context  Cancel context.CancelFunc  Jobs chan Job}func (w *Worker) Run() {  for {    select {    case <-w.Ctx.Done():      return    case j := <-w.Jobs:      // Do some work  }}go w.Run()w.Cancel()每种方法的优点/缺点是什么?我应该默认哪一个?我知道如果我想杀死一棵相互连接的 goroutines 树,我应该使用上下文方法,但我们只是说我有一个简单的 worker,它不会在内部启动其他 goroutines。
查看完整描述

1 回答

?
紫衣仙女

TA贡献1839条经验 获得超15个赞

Go 1.7 发行说明

语境

Go 1.7 将 golang.org/x/net/context 包作为上下文移入标准库。这允许在其他标准库包(包括 net、net/http 和 os/exec)中使用上下文来取消、超时和传递请求范围的数据,如下所述。


有问题。引入上下文包来解决它们。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信