我想知道为什么我们需要在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中等待吗?
谢谢!
答案 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异步完成的原因:你不想在这个函数中等待。你只想要频道。