[英]Go routine with channel deadlock
我剛開始學習Go,所以請多多包涵,我嘗試過Go的例程和頻道,但由於某種原因陷入僵局。
這是例子
package main
import (
"fmt"
"sync"
)
func main() {
total := 2
var wg sync.WaitGroup
wg.Add(total)
ch := make(chan int)
for idx := 0; idx < total; idx++ {
fmt.Printf("Processing idx %d\n", idx)
go func(idx int) {
defer wg.Done()
ch <- idx
}(idx)
}
for val := range ch {
fmt.Println(val)
}
fmt.Println("Wait")
wg.Wait()
}
引發錯誤
Processing idx 0
Processing idx 1
1
0
fatal error: all goroutines are asleep - deadlock!
range ch
從range ch
讀取直到關閉。
您叫多少次close(ch)
? for val := range ch
循環何時終止?
您什么時候應該關閉頻道? 您在這里有很多選擇,但一種方法是添加另一個goroutine:
go func() {
wg.Wait()
close(ch)
}()
例如,在分離所有將寫到channel-then- wg.Done()
- wg.Done()
例程之后,以便一旦所有寫程序完成寫操作,就關閉該通道。 (一旦增加了wg
計數以考慮所有編寫者,就可以運行此goroutine。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.