使用 goroutine 转到 WaitGroup

我不知道为什么我们需要运行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 中等待?


30秒到达战场
浏览 175回答 2
2回答

繁星点点滴滴

为什么我们需要运行wg.Wait()in goroutine?在您提到的示例 ( coop/blob/master/coop.go#L85) 中,等待是在 goroutine 中,以便立即返回一个通道,该通道将指示所有其他 goroutine 何时完成。这些是要启动的 goroutine:for _, fn := range fns {&nbsp; &nbsp; go func(f func()) {&nbsp; &nbsp; &nbsp; &nbsp; f()&nbsp; &nbsp; &nbsp; &nbsp; wg.Done()&nbsp; &nbsp; }(fn)}他们通过var wg sync.WaitGroup.该 WaitGroup 设置为等待正确数量的 goroutine 完成:wg.Add(len(fns))等待是在 goroutine 中完成的,因为它反过来会向通道发出全局完成信号:go func() {&nbsp; &nbsp; wg.Wait()&nbsp; &nbsp; doneSig(ch, true)}()但是通道立即返回。ch := make(chan bool, 1)...return ch这就是 Wait 异步完成的原因:您不想在此函数中等待。你只想要频道。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go