如何等待一组goroutines?

时间:2015-12-29 18:59:14

标签: go concurrency goroutine

让我们说我想开始一组goroutine,而不是等待所有人完成(例如返回)。 我可以想到一些基于通道的解决方案(例如创建一个频道并听取它计算收到的消息,这些消息将由每个goroutine发送并在收到相应数量的消息后退出)但是可能有更优雅/更有效的解决方案因为这种情况似乎很常见。

1 个答案:

答案 0 :(得分:6)

是;你需要一个*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")
}