gpt4 book ai didi

go - 使用 sync.WaitGroup 时获取 "fatal error: all goroutines are asleep - deadlock!"

转载 作者:IT王子 更新时间:2023-10-29 01:24:47 28 4
gpt4 key购买 nike

我正在尝试拆分一组 goroutine,然后等待它们全部完成。

import "sync"

func doWork(wg sync.WaitGroup) error {
defer wg.Done()
// Do some heavy lifting... request URL's or similar
return nil
}

func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go doWork(wg)
}
wg.Wait()
}

但是,当我运行这段代码时,出现以下错误:

fatal error: all goroutines are asleep - deadlock!

goroutine 16 [semacquire]:
sync.runtime_Semacquire(0xc20818c658)
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/sema.goc:199 +0x30
sync.(*WaitGroup).Wait(0xc2080544e0)
/usr/local/Cellar/go/1.3/libexec/src/pkg/sync/waitgroup.go:129 +0x14b
main.main()
/Users/kevin/code/vrusability/scripts/oculus_share_ratings.go:150 +0x398

我很困惑,因为我写得差不多了exactly as the documentation example demonstrates .

最佳答案

您需要传递一个指向 WaitGroup 的指针,而不是 WaitGroup 对象。当您传递实际的 WaitGroup 时,Go 会复制该值,并在副本上调用 Done()。结果是原始 WaitGroup 将有 10 个 Add 而没有 Done,并且 WaitGroup 的每个副本将有一个 Done(),但是当 WaitGroup 传递给函数时有许多 Add。

改为传递一个指针,每个函数都将引用相同的 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)
}
}

关于go - 使用 sync.WaitGroup 时获取 "fatal error: all goroutines are asleep - deadlock!",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25234898/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com