首页 >后端开发 >Golang >为什么我的 Go 代码会产生'致命错误:所有 goroutine 都在睡觉 - 死锁!” sync.WaitGroup 出错?

为什么我的 Go 代码会产生'致命错误:所有 goroutine 都在睡觉 - 死锁!” sync.WaitGroup 出错?

Linda Hamilton
Linda Hamilton原创
2024-12-09 21:17:11272浏览

Why Does My Go Code Produce a

使用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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn