Go 中的死锁:“抛出:所有 goroutine 都在睡眠”
Go 程序中,当两个或多个 goroutine 等待时,就会发生死锁彼此完成,导致冻结状态,无法取得任何进展。这个问题经常被报告为“抛出:所有 goroutine 都在睡眠 - 死锁!”
让我们分析一个简化的 Go 程序来理解为什么会发生这种死锁:
package main import ( "fmt" ) func total(ch chan int) { res := 0 for iter := range ch { res += iter } ch <- res } func main() { ch := make(chan int) go total(ch) ch <- 1 ch <- 2 ch <- 3 fmt.Println("Total is ", <-ch) }
在这个程序中, Total 函数计算通过 ch 通道发送的数字的总和,并将结果发送回同一通道。出现死锁是因为满足以下条件:
这会产生死锁情况,两个 goroutine(一个运行总计和一个) in main) 正在等待对方采取行动,导致“抛出:所有 goroutine 都在睡眠”错误。
解决此问题死锁,我们可以在发送最后一个值后关闭 main 函数中的 ch 通道:
ch <- 3 close(ch)
关闭通道向总 goroutine 发出信号,表明没有更多输入,允许其完成计算并发送结果返回到ch.
以上是陷入死锁:为什么会发生'抛出:所有 goroutine 都在睡觉”?的详细内容。更多信息请关注PHP中文网其他相关文章!