使用goroutine转到WaitGroup

时间:2014-12-04 07:24:31

标签: go sync 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()
    }()
}

但是这个永远不会永远等待

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中等待吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

  

为什么我们需要在goroutine中运行wg.Wait()

在你提到的例子中(coop/blob/master/coop.go#L85),等待是在goroutine中,以便立即返回一个通道,该通道将指示所有其他goroutine何时完成。 这些是要开始的goroutines:

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异步完成的原因:你不想在这个函数中等待。你只想要频道。