【问题标题】:What is the canonical way to control the closing of goroutine if one goroutine is complete?如果一个 goroutine 完成,控制 goroutine 关闭的规范方法是什么?
【发布时间】:2017-12-09 12:56:52
【问题描述】:

我有一个定义任务的结构体,每个任务都在一个 goroutine 中运行,我希望所有 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”,因为这是您感兴趣的(以及您可以在哪里找到示例)而不是线程。
  • @Volker 感谢您的建议,我确实做了一些研究,但我发现的大多数示例都要求等待所有 goroutine 完成,而不是等到第一个完成。我编辑我的措辞以在术语中更准确
  • @user3591466:你怎么能有一片goroutine?您是否正在寻找取消,例如Context
  • @JimB 你是对的,goroutine 的切片令人困惑,我实际上有一个任务切片,每个任务都在一个 goroutine 中运行。我正在寻找能够在第一个任务完成后关闭所有任务的库

标签: multithreading go channel goroutine


【解决方案1】:

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

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

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

https://blog.golang.org/pipelines

(在此处查找“显式取消”)

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

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

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

【讨论】:

    猜你喜欢
    • 2023-04-03
    • 2014-11-15
    • 2019-01-16
    • 2019-02-01
    • 2018-12-10
    • 2013-07-31
    • 2016-04-22
    • 1970-01-01
    • 2018-02-24
    相关资源
    最近更新 更多