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

标签 multithreading go channel goroutine

我有一段定义任务的结构,每个任务都在一个 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 取消的最“标准”方式。

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

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

关于multithreading - 如果一个 goroutine 已完成,控制 goroutine 关闭的规范方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44933295/

相关文章:

java - StringRedisTemplate线程安全能力

go - 如何避免 VSCode 在 Golang 中删除未使用的 var 或导入

go - 如何让一个接口(interface)方法返回另一个接口(interface)?

go - 使用 channel 进行请求-响应通信的惯用方式

linux - epoll()、互斥量和信号量之类的系统调用是如何在后台实现的?

c++ - 由于异常而展开时处理 C++ 析构函数中的 pthread 取消点

multithreading - Akka:如何确保已收到消息?

dictionary - 如何找出 'map[string][][]int' 是否有值

rust - 如何正确退出 mpsc::Receiver 上的线程阻塞

go - 扇入 channel 至单 channel