[英]How to cacth if Goroutine finished and close error channel?
在下面的代碼片段中,我試圖循環一些數據,並為每次迭代啟動新的 go 例程。 我已經創建了錯誤通道,如果出現一些錯誤 goroutine 它應該將其寫入通道。 所以我有兩個問題:
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.