如果Goroutine完成并关闭错误通道,如何计算?
在下面截取的代码中,我尝试循环一些数据,并为每个迭代启动新的go例程。我已经创建了错误通道,如果一些错误出现在goroutine中,它应该将其写入通道。所以我有两个问题:如果Goroutine完成并关闭错误通道,如何计算?,go,goroutine,Go,Goroutine,在下面截取的代码中,我尝试循环一些数据,并为每个迭代启动新的go例程。我已经创建了错误通道,如果一些错误出现在goroutine中,它应该将其写入通道。所以我有两个问题: 如何捕获所有goroutine是否完成并关闭错误通道,以便从“for”循环中断以继续执行主函数 如果在每个例程中,我将调用一些将值附加到全局变量的函数,那么竞争条件会有任何问题吗?如果是,如何处理 主程序包 进口( “fmt” ) var errc=制造(信道错误,15) func fetchAll(){ 变量N=15 对于i
主程序包
进口(
“fmt”
)
var errc=制造(信道错误,15)
func fetchAll(){
变量N=15
对于i:=0;i
wg:=sync.WaitGroup{}
for i := 0; i < N; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
err := error(nil)
if err != nil {
errc <- err
}
// Doing some stuff there
fmt.Println(i)
}(i)
}
go func() {
wg.Wait()
close(errc)
}
如果您在goroutine之间共享变量,请使用goroutine之间共享的sync.Mutex来控制对这些变量的读/写,否则您将遇到竞争条件。1.使用waitgroups.2.是的。有很多解决方案,主要涉及通道和互斥体。您必须更具体地说明这一点,并可能打开一个网元w、 具体问题。我已经尝试了工作组。但它对我不起作用。你能和工作组一起检查我的代码吗?见更新的答案。
wg:=sync.WaitGroup{}
for i := 0; i < N; i++ {
wg.Add(1)
go func(i int) {
defer wg.Done()
err := error(nil)
if err != nil {
errc <- err
}
// Doing some stuff there
fmt.Println(i)
}(i)
}
go func() {
wg.Wait()
close(errc)
}
for err:=range errc {
fmt.Println(err)
}