【go语言系列】sync.WaitGroup
说明
官方文档对 WaitGroup 的描述是:一个 WaitGroup 对象可以等待一组协程结束
。使用方法是:
- main 协程通过调用
wg.Add(delta int)
设置 worker 协程的个数,然后创建 worker 协程; - worker 协程执行结束以后,都要调用
wg.Done()
; - main 协程调用
wg.Wait()
且被 block,直到所有 worker 协程全部执行结束后返回。
demo
举一个例子来说明这个问题
下面三个小demo可以实现同样的功能,但是下一个都比上一个更加的优雅
1 |
|
对于方法3来说,wg.Done()要放在写成结束之后,否则就会有问题
当wg.Done()放在位置1处,如下为两次运行代码的结果。可以看到,很可能在协程还没有开始运行,主进程就结束了
1 |
|
wg.Done()放在位置2处就没有问题了,每次当协程运行结束之后才将waitGroup中的协程减1,就不会有影响了~
参考
【go语言系列】sync.WaitGroup
http://example.com/2023/03/21/go/【go语言系列】sync.WaitGroup/