当前位置:  开发笔记 > 编程语言 > 正文

如何等待一组goroutines?

如何解决《如何等待一组goroutines?》经验,为你挑选了1个好方法。

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



1> twotwotwo..:

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

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有