【发布时间】:2022-01-27 23:03:50
【问题描述】:
我在整理 go 例程并让它们与主要 go 例程上的频道进行通信时遇到问题。为简化起见,我的代码如下所示:
func main() {
channel := make(chan string)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go performTest(channel, &wg, i)
}
wg.Wait()
close(channel)
for line := range channel {
fmt.Print(line)
}
}
func performTest(channel chan string, wg *sync.WaitGroup, i int) {
defer wg.Done()
// perform some work here
result := fmt.sprintf("Pretend result %d", i)
channel <- result
}
这似乎进入了某种僵局,但我不明白为什么。它卡在wg.Wait() 上,尽管我希望它会在所有 goroutine 都在等待组上调用 Done 后继续。我在这里想念什么?我想等待 goroutines,然后遍历通道中的所有结果。
【问题讨论】:
-
你正在等待阅读频道 - go.dev/play/p/EnbfKe_d-BL
-
干杯,把等待放在工作之后,但我不明白为什么我不能在阅读频道之前等待?
-
问题是必须从不同的 goroutine 写入/读取无缓冲的 chanel。在您的示例中,如果您将通道缓冲为
channel := make(chan string, 10),则不会发生死锁。更好的选择是将写入或读取部分运行到它自己的 goroutine 中。