【问题标题】:How to wait for a group of goroutines? [duplicate]如何等待一组 goroutine? [复制]
【发布时间】:2015-12-29 18:59:14
【问题描述】:
假设我想启动一组 goroutine,然后等待它们全部完成(例如返回)。
我可以想到一些基于通道的解决方案(例如,创建一个通道并收听它计算收到的消息,这些消息应由每个 goroutine 发送并在收到相应数量的 msg 后退出)但也许有一个更优雅/有效的解决方案,因为这种情况似乎很常见。
【问题讨论】:
标签:
go
concurrency
goroutine
【解决方案1】:
是的;你想要一个*sync.WaitGroup,你可以在开始每个任务之前调用waitGroup.Add(1),在它完成时调用waitGroup.Done(),在你开始一切并想要等待它完成后调用waitGroup.Wait(),like this :
package main
import (
"fmt"
"sync"
"time"
)
func main() {
wg := new(sync.WaitGroup)
for i := 1; i < 3; i++ {
wg.Add(1)
go func(i int) { // ensures each run gets distinct i
fmt.Println("Sleeping", i, "seconds")
time.Sleep(time.Duration(i) * time.Second)
fmt.Println("Slept", i, "seconds")
wg.Done()
}(i)
}
wg.Wait()
fmt.Println("All done")
}