如果Goroutine完成并关闭错误通道,如何计算?

如果Goroutine完成并关闭错误通道,如何计算?,go,goroutine,Go,Goroutine,在下面截取的代码中,我尝试循环一些数据,并为每个迭代启动新的go例程。我已经创建了错误通道,如果一些错误出现在goroutine中,它应该将其写入通道。所以我有两个问题: 如何捕获所有goroutine是否完成并关闭错误通道,以便从“for”循环中断以继续执行主函数 如果在每个例程中,我将调用一些将值附加到全局变量的函数,那么竞争条件会有任何问题吗?如果是,如何处理 主程序包 进口( “fmt” ) var errc=制造(信道错误,15) func fetchAll(){ 变量N=15 对于i

在下面截取的代码中,我尝试循环一些数据,并为每个迭代启动新的go例程。我已经创建了错误通道,如果一些错误出现在goroutine中,它应该将其写入通道。所以我有两个问题:

  • 如何捕获所有goroutine是否完成并关闭错误通道,以便从“for”循环中断以继续执行主函数
  • 如果在每个例程中,我将调用一些将值附加到全局变量的函数,那么竞争条件会有任何问题吗?如果是,如何处理
  • 主程序包
    进口(
    “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)
    }