假设我想开始一组goroutine而不是等待所有这些都完成(例如返回).我可以想到一些基于通道的解决方案(例如创建一个通道并监听它计算收到的消息,这些消息应由每个goroutine发送并在收到相应数量的消息后退出)但是可能有一个更优雅/更有效的解决方案,因为这种情况似乎非常普遍.
是; 你想要一个*sync.WaitGroup
,你可以waitGroup.Add(1)
在开始每个任务之前通过调用,waitGroup.Done()
它完成时,以及waitGroup.Wait()
一旦你已经开始所有事情并想等待它全部完成,就像这样:
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") }