我刚开始学习围棋,所以请耐心等待,我尝试过使用 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 %dn", 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
从通道读取,直到通道关闭。
你给close(ch)
打了多少次电话?for val := range ch
循环何时终止?
什么时候应该关闭频道? 你在这里有很多选择,但一种方法是添加另一个goroutine:
go func() {
wg.Wait()
close(ch)
}()
例如,在剥离所有将写入通道然后调用wg.Done()
的例程之后,一旦所有写入器完成写入,通道就会关闭。 (您可以在增加wg
计数以考虑所有编写器后立即运行此 goroutine。