我正在嘗試sync.WorkGroup使用通道啟動(dòng)多個(gè) go-routines,并從這些工作人員那里收集錯(cuò)誤。(這是一個(gè)好方法嗎?)。每當(dāng)我嘗試寫入錯(cuò)誤通道時(shí),程序似乎都會(huì)停止。無法弄清楚它的原因。場景看起來像這樣 -package mainimport ( "fmt" "time")func worker(id int, i int, errs chan<- errs) { defer wg.Done() errs <- fmt.Errorf("Sample Error") // This is where the executions seems to be stuck return }func main() { errs := make(chan int) var wg sync.WaitGroup for w := 1; w <= 3; w++ { wg.Add(1) go worker(w, w, errs) } wg.Wait() fmt.Printf("Hello, all tasks done.") // Never executed. close(errs) for err := range errs{ fmt.Printf("%s", err.Error()) }}
1 回答

慕標(biāo)琳琳
TA貢獻(xiàn)1830條經(jīng)驗(yàn) 獲得超9個(gè)贊
如果沒有其他 goroutine 從它讀取,則通道寫入將阻塞。當(dāng)您寫入錯(cuò)誤通道時(shí),沒有其他 goroutine 從它讀取,因此它會(huì)阻塞。
你的程序有幾個(gè)問題:
您必須在調(diào)用之前從錯(cuò)誤通道開始讀取
wg.Wait
,因?yàn)檫@將等待 goroutine 完成,但如果您不從錯(cuò)誤通道讀取,goroutine 將不會(huì)運(yùn)行。關(guān)閉錯(cuò)誤通道后,您正嘗試從錯(cuò)誤通道中讀取。
像這樣的東西應(yīng)該工作:
errs := make(chan int, numJobs)
go func() {
for err := range errs{
fmt.Printf("%s", err.Error())
}()
for w := 1; w <= 3; w++ {
wg.Add(1)
go worker(w, w, results)
}
- 1 回答
- 0 關(guān)注
- 149 瀏覽
添加回答
舉報(bào)
0/150
提交
取消