我有一段定义任务的结构,每个任务都在一个 goroutine 中运行,我希望所有的 goroutines 在第一个 goroutines 通过信号 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 完成?
最佳答案
常见的习惯用法是在调用代码和 goroutine 之间共享一个 Done
channel 。
然后每个 goroutine 每次都通过 select
检查那个 channel
向调用代码发送一个新值。
你可以在 Go 的博客中找到一个很好的例子:
https://blog.golang.org/pipelines
(在那里寻找“明确取消”)
后来,他们将 context
包合并到标准库中,这是现在管理 goroutine 取消的最“标准”方式。
您可以在包本身的文档中找到一个很好的示例:
关于multithreading - 如果一个 goroutine 已完成,控制 goroutine 关闭的规范方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933295/