【Golang】Sync.WaitGroup的使用

示例

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

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()来阻塞等待所有任务完成。

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,这样就无需通过估算时间睡眠这种方式,等待协程的结束,也可以这样写,如下:

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Maybe_ch

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值