【发布时间】:2019-06-17 13:18:54
【问题描述】:
清理 goroutine 有两种不同的方法。
-
使用 kill 通道表示取消,使用 done 通道表示 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。
【问题讨论】:
-
上下文方法更简单,可组合,允许取消或超时,并且是标准的。你为什么不使用它?
标签: go concurrency