所有Goroutine完成后,让golang关闭使用过的通道

所有Goroutine完成后,让golang关闭使用过的通道,go,goroutine,Go,Goroutine,我正在尝试运行一些goroutines,这些goroutines将把它们的结果提供给一个频道。我需要一个好办法,让通道关闭后,所有的gorouting完成 我的第一次尝试是在生成所有go例程之后关闭它,但我认为在所有Goroutine都可以发送结果之前,该频道不知何故已经关闭 for i:=0; i<=10;i++{ go func(){ result:=calculate() c<-result }() } close(c) for result:= ran

我正在尝试运行一些goroutines,这些goroutines将把它们的结果提供给一个频道。我需要一个好办法,让通道关闭后,所有的gorouting完成

我的第一次尝试是在生成所有go例程之后关闭它,但我认为在所有Goroutine都可以发送结果之前,该频道不知何故已经关闭

for i:=0; i<=10;i++{
  go func(){
    result:=calculate()
    c<-result
  }()
}
close(c)
for result:= range c{
  all_result=append(all_result, result...)
}
i:=0的
;i类型应该封装您想要做的事情,而不需要睡眠呼叫或忙着等待。它允许您等待任意数量的任务,而不必担心它们完成的顺序

以原始示例为例,您可以将其更改为使用如下所示的等待组:

var wg sync.WaitGroup
for i:=0; i<=10;i++{
    wg.Add(1)
    go func(){
        result:=calculate()
        c<-result
        wg.Done()
    }()
}
// Close the channel when all goroutines are finished
go func() {
    wg.Wait()
    close(c)
}()
for result:= range c{
    all_result=append(all_result, result...)
}
var wg sync.WaitGroup

对于i:=0;这是一个很好的解决方案。我想知道如果我用这个,我真的需要后一个goroutine来关闭频道吗。所以,我尝试了
wg.Wait();在没有goroutine的情况下关闭(c)
,它给了我一个死锁错误。这是为什么?您的goroutines将被阻止尝试写入通道
c
,直到在最终for循环中开始读取值。
wg.Wait()
调用也将被阻止,因为它正在等待
wg.Done()
调用。所以在这种情况下你真的需要额外的goroutine。谢谢!我完全明白。:)
var wg sync.WaitGroup
for i:=0; i<=10;i++{
    wg.Add(1)
    go func(){
        result:=calculate()
        c<-result
        wg.Done()
    }()
}
// Close the channel when all goroutines are finished
go func() {
    wg.Wait()
    close(c)
}()
for result:= range c{
    all_result=append(all_result, result...)
}