使用运行goroutine返回for-select循环时会发生什么

时间:2017-06-28 13:05:11

标签: go

我试图想办法在等待多个goroutine上的结果时如何尽可能缩短运行时间。我们的想法是在从通道(结果通道)检索消息时执行for-select循环,并在结果为false时跳出循环。随后,可能还有一个或多个goroutine正在运行,我不太清楚背景会发生什么。

考虑一下:

results := make(chan bool, int NumRequests)
go DoSomething(results) // DoSomething sends the result on results channel
go DoSomething(results) // DoSomething sends the result on results channel
go DoSomething(results) // DoSomething sends the result on results channel
for {
    select {
    case r := <- results:
        if !r {
            return
        }
    }
}

我的问题是 - 如果我返回时会有goroutines尝试将结果发送到频道会怎么样?我已经创建了一个缓冲的结果通道,如上所示,因此goroutines在运行时不会死锁。这样做会在内存方面发生什么?是否会出现goroutine泄漏?做这样的事的惯用方法是什么?

1 个答案:

答案 0 :(得分:5)

这是可取消上下文背后的确切目的。看一下context.WithCancel的示例,它会显示如何完全按照您的描述进行操作。