如果一个goroutine完成,控制关闭goroutine的规范方法是什么?

时间:2017-07-05 18:14:49

标签: multithreading go channel goroutine

我有一个定义任务的结构片段,每个任务都在goroutine中运行,我希望每当第一个通过信号task.signalComplete

完成任务时,所有goroutine都会停止

目前我有以下内容。

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完成?

1 个答案:

答案 0 :(得分:2)

常见的习惯用法是在调用代码和goroutines之间共享Done个通道。

然后每个goroutine每次都会通过select检查该频道 向调用代码发送一个新值。

你可以在Go的博客中找到一个很好的例子:

https://blog.golang.org/pipelines

(在那里寻找“显式取消”)

后来,他们将context包合并到标准库中,这是管理goroutine取消的最“标准”方法。

您可以在软件包本身的文档中找到一个很好的示例:

https://golang.org/pkg/context/#example_WithCancel