前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Golang】Sync.WaitGroup的使用

【Golang】Sync.WaitGroup的使用

作者头像
MaybeHC
发布2024-04-23 19:36:36
890
发布2024-04-23 19:36:36
举报
文章被收录于专栏:技术之路技术之路

示例

这里我们直接来用代码进行讲解,以下面的代码为例我们需要等待协程结束后查询count的,所以最后在末尾处使用了睡眠time.Sleep(time.Second* 2) ,目前的是一个简单的业务逻辑我们可以使用睡眠来等待,但是如果遇到业务复杂的情况,时间是无法进行预料的,这样的方法就不能使用了,

代码语言:javascript
复制
func main(){
	count := 0
	for i:=0 ;i<10000;i++{
		go func() {
			//数据处理
			count++
		}()
	}
	time.Sleep(time.Second* 2)
	fmt.Println(count)
}

这里我们可以使用WaitGroup来对代码进行优化

Sync.WaitGroup

简单使用就是在创建一个任务的时候wg.Add(1), 任务完成的时候使用wg.Done()来将任务减一。使用wg.Wait()来阻塞等待所有任务完成。

代码语言:javascript
复制
func main(){
	wg:= sync.WaitGroup{}
	count := 0
	for i:=0 ;i<10000;i++{
		wg.Add(1)
		go func() {
			defer wg.Done()
			count++
		}()
	}
	wg.Wait()
	fmt.Println(count)
}

代码使用WaitGroup,这样就无需通过估算时间睡眠这种方式,等待协程的结束,也可以这样写,如下:

代码语言:javascript
复制
func main(){
	wg:= sync.WaitGroup{}
	count := 0
    wg.Add(10000)
	for i:=0 ;i<10000;i++{
		go func() {
			defer wg.Done()
			count++
		}()
	}
	wg.Wait()
	fmt.Println(count)
}

WaitGroup 对象内部有一个计数器,最初从0开始,它有三个方法:Add(), Done(), Wait() 用来控制计数器的数量。Add(n) 把计数器设置为n ,Done() 每次把计数器-1 ,wait() 会阻塞代码的运行,直到计数器地值减为0。

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-04-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

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

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 示例
  • Sync.WaitGroup
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com