猿问

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

有两种不同的方法来清理 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。


眼眸繁星
浏览 88回答 1
1回答

紫衣仙女

Go 1.7 发行说明语境Go 1.7 将 golang.org/x/net/context 包作为上下文移入标准库。这允许在其他标准库包(包括 net、net/http 和 os/exec)中使用上下文来取消、超时和传递请求范围的数据,如下所述。有问题。引入上下文包来解决它们。
随时随地看视频慕课网APP

相关分类

Go
我要回答