为了账号安全,请及时绑定邮箱和手机立即绑定

使用 goroutine 转到 WaitGroup

使用 goroutine 转到 WaitGroup

Go
30秒到达战场 2021-09-09 15:23:24
我不知道为什么我们需要运行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 异步完成的原因:您不想在此函数中等待。你只想要频道。


查看完整回答
反对 回复 2021-09-09
  • 2 回答
  • 0 关注
  • 174 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信