我有一个定义任务的结构片段,每个任务都在goroutine中运行,我希望每当第一个通过信号task.signalComplete
目前我有以下内容。
for _, task := range taskList {
go func(task *myTask, firstCompleteSignal chan<- bool) {
for {
select {
// When the task completes, it emit signalComplete
case <-task.signalComplete:
firstCompleteSignal<-true
return
}
}
}(task, firstCompleteSignal)
}
for {
select {
case <-firstCompleteSignal:
// manually stop all go thread
return
}
}
这是规范吗?
或者是否有库为我这样做,例如sync.WaitGroup等待所有goroutine完成?
答案 0 :(得分:2)
常见的习惯用法是在调用代码和goroutines之间共享Done
个通道。
然后每个goroutine每次都会通过select
检查该频道
向调用代码发送一个新值。
你可以在Go的博客中找到一个很好的例子:
https://blog.golang.org/pipelines
(在那里寻找“显式取消”)
后来,他们将context
包合并到标准库中,这是管理goroutine取消的最“标准”方法。
您可以在软件包本身的文档中找到一个很好的示例: