我不知道为什么我们需要运行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 中等待?
谢谢!
为什么我们需要运行
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)
这就是等待异步完成的原因:您不想在此函数中等待。你只想要频道。
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |