簡體   English   中英

如果 Goroutine 完成並關閉錯誤通道,如何判斷?

[英]How to cacth if Goroutine finished and close error channel?

在下面的代碼片段中,我試圖循環一些數據,並為每次迭代啟動新的 go 例程。 我已經創建了錯誤通道,如果出現一些錯誤 goroutine 它應該將其寫入通道。 所以我有兩個問題:

  1. 如何捕獲所有 goroutines 是否完成並關閉錯誤通道以從“for”循環中斷以繼續主 function 執行?
  2. 如果在每個例程中我都會調用一些將值附加到全局變量的函數,那么競爭條件會有什么問題嗎? 如果是,如何處理。
package main

import (
    "fmt"
)

var errc = make(chan error, 15)


func fetchAll() {
    var N = 15
    for i := 0; i < N; i++ {
        go func(i int) {
            err := error(nil)
            if err != nil {
                errc <- err
            }
            // Doing some stuff there
            fmt.Println(i)
        }(i)
    }
}

func main() {
    fetchAll()
    for {
        select {
        case err := <-errc:
            fmt.Println(err)
            break
        }
    }
    fmt.Println("Finished All")

}

使用等待組:

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)
}

然后你可以改變main中的循環。 當通道關閉時,此循環將終止。

for err:=range errc {
  fmt.Println(err)
}

如果你在 goroutines 之間共享變量,請使用 goroutines 之間共享的 sync.Mutex 來控制對這些變量的讀/寫,否則你會遇到競爭條件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM