我正在尝试剥离一组 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 +0x30sync.(*WaitGroup).Wait(0xc2080544e0) /usr/local/Cellar/go/1.3/libexec/src/pkg/sync/waitgroup.go:129 +0x14bmain.main() /Users/kevin/code/vrusability/scripts/oculus_share_ratings.go:150 +0x398我很困惑,因为我几乎完全按照文档示例演示的方式编写了它。
2 回答
SMILET
TA贡献1796条经验 获得超4个赞
您需要传递一个指向 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)
}
}
- 2 回答
- 0 关注
- 248 浏览
添加回答
举报
0/150
提交
取消