有两种不同的方法来清理 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。
紫衣仙女
相关分类