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

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

Linda Hamilton
发布: 2024-12-09 21:17:11
原创
275 人浏览过

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板