前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go并发(五):WaitGroup

Go并发(五):WaitGroup

作者头像
灰子学技术
发布2023-10-30 15:33:03
1270
发布2023-10-30 15:33:03
举报
文章被收录于专栏:灰子学技术灰子学技术

本篇其实是Go并发编程的补充篇章,只是用来介绍WaitGroup的使用介绍。

对于Go的并发编程来说,主协程需要知道其他的协程何时结束。通常我们的做法是采用channel的方式来控制,这种做法很好,可以参见我的另外一个帖子(Go并发之channel篇:https://mp.weixin.qq.com/s/PIb-gGBootc6581pHhi5ew)。但是对于一些简单的协程控制来说,channel显得有些大材小用,而WaitGroup就可以派上用场了。

一、WaitGroup定义

WaitGroup是Go pkg中sync 包里的内容:https://golang.org/pkg/sync/,一个 WaitGroup 会等待一系列 goroutine 直到它们全部运行完毕为止。主 goroutine 通过调用 Add 方法来设置需要等待的 goroutine 数量, 而每个运行的 goroutine 则在它们运行完毕时调用 Done 方法。与此同时, 调用 Wait 方法可以阻塞直到所有 goroutine 都运行完毕为止。

1.主协程对其他协程什么都不处理的例子:

通过上面的输出可以看出,主协程并没有等待其他协程的结束,就自己退出了,所以看不到关于其他协程的任何打印。

2.主协程通过超时机制来等待其他协程结束的例子:

在主协程中新加了超时1s来等待其他协程的结束,通过打印可以看出来,其他协程已经运行并结束。

3.使用wg的例子:

通过打印信息可以看到,主协程通过wg.Wait()来判断计数器有没有变为0,来判断其他的协程有没有结束,在主协程检测到wg的计数器变为0之后,便知道其他协程都已经结束了。

二、WaitGroup中的API介绍

1. (*WaitGroup) Add 方法

func(wg*WaitGroup)Add(delta int)

delta可以为正数,也可以为负数,在wg对应的计数器没有变为0之前delta可以为负数,但是切记不要让wg计数器变为负数,因为一旦变为负数,便会panic。

通常Add在协程启动之前使用。

2. (*WaitGroup) Done 方法

func(wg*WaitGroup)Done()

对wg计数器进行减1操作。

通常Done在协程执行结束的时候使用。

3.(*WaitGroup) Wait 方法

func(wg*WaitGroup)Wait()

阻塞直至 WaitGroup 计数器的值为 0 。

通常在主协程中使用,用来等待其他的协程结束。


参考文献:

sync 的pkg包:https://golang.org/pkg/sync/

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-09-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 灰子学技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、WaitGroup定义
  • 二、WaitGroup中的API介绍
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档