使用 goroutine 转到 WaitGroup

6 sync go goroutine

我不知道为什么我们需要运行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()
    }()
}
Run Code Online (Sandbox Code Playgroud)

但这个永远不会结束永远等待

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()
}
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么我需要在另一个 goroutine 中等待?

谢谢!

Von*_*onC 1

为什么我们需要运行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)
}
Run Code Online (Sandbox Code Playgroud)

他们通过 提到完成var wg sync.WaitGroup
WaitGroup 设置为等待正确数量的 goroutine 完成:

wg.Add(len(fns))
Run Code Online (Sandbox Code Playgroud)

等待是在 goroutine 中完成的,因为它会依次向通道发出全局完成信号:

go func() {
    wg.Wait()
    doneSig(ch, true)
}()
Run Code Online (Sandbox Code Playgroud)

但频道立即返回。

ch := make(chan bool, 1)
...
return ch
Run Code Online (Sandbox Code Playgroud)

这就是等待异步完成的原因:您不想在此函数中等待。你只想要频道。