我不知道为什么我们需要运行wg.Wait()在goroutine// This one works as expected...func main() { var wg sync.WaitGroup for i:=0; i<5; i++ { wg.Add(1) go func() { defer wg.Done() }() time.Sleep(time.Second) } go func() { wg.Wait() }()}但这个永远不会结束永远等待func main() { var wg sync.WaitGroup for i:=0; i<5; i++ { wg.Add(1) go func() { defer wg.Done() }() time.Sleep(time.Second) } wg.Wait()}谁能解释为什么我需要在另一个 goroutine 中等待?
2 回答
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
为什么我们需要运行wg.Wait()in goroutine?
在您提到的示例 ( coop/blob/master/coop.go#L85) 中,等待是在 goroutine 中,以便立即返回一个通道,该通道将指示所有其他 goroutine 何时完成。这些是要启动的 goroutine:
for _, fn := range fns {
go func(f func()) {
f()
wg.Done()
}(fn)
}
他们通过var wg sync.WaitGroup.
该 WaitGroup 设置为等待正确数量的 goroutine 完成:
wg.Add(len(fns))
等待是在 goroutine 中完成的,因为它反过来会向通道发出全局完成信号:
go func() {
wg.Wait()
doneSig(ch, true)
}()
但是通道立即返回。
ch := make(chan bool, 1)
...
return ch
这就是 Wait 异步完成的原因:您不想在此函数中等待。你只想要频道。
- 2 回答
- 0 关注
- 174 浏览
添加回答
举报
0/150
提交
取消