使用sync.WaitGroup时出现“All Goroutines Asleep”错误
在您的代码中,您遇到了“致命错误:所有 goroutine 都处于睡眠状态”睡着了——僵局!”信息。发生这种情况是因为您将 WaitGroup 的副本传递给每个 goroutine,而不是对原始 Goroutine 的引用。
根据文档,WaitGroup 要求您传递指向变量的指针而不是变量本身。当你传递实际的 WaitGroup 值时,Go 会进行复制,从而产生多个计数不同的 WaitGroup 实例。
更新后的代码应该是:
import "sync" func doWork(wg *sync.WaitGroup) error { defer wg.Done() // Do some heavy lifting... request URL's or similar return nil } func main() { wg := &sync.WaitGroup{} for i := 0; i < 10; i++ { wg.Add(1) go doWork(wg) } wg.Wait() }
通过传递指针,所有 goroutine引用相同的 WaitGroup。当他们调用 Done() 时,它会减少原始 WaitGroup 中的计数,从而产生预期的行为。
以上是为什么我的 Go 代码会产生'致命错误:所有 goroutine 都在睡觉 - 死锁!” sync.WaitGroup 出错?的详细内容。更多信息请关注PHP中文网其他相关文章!