Golang中超简单的协程同步工具
从需求出发
现在有如下需求:多协程处理一批数据,但需要所有协程都跑完才可以继续下一步,这个需求在日常的处理数据中非常常见。多协程可以最大限度的压榨CPU和IO,但从业务角度来看,又需要保持一致性,这个时候我们就需要协程同步技术。
流程图解
从下图可以看到在3个协程运行的时间都不可控,但为了达到同步的目的,需要等待3个携程全部跑完再继续下面的流程。
image
解
Golang提供了使用非常方便的包sync.waitgroup
,这个包就提供了3个方法,
Add(delta int)
添加携程记录Done()
移除携程记录Wait()
同步等待所有记录的携程全部结束
代码
package main import ( "fmt" "sync" "time") var wg sync.WaitGroup func main() { for i := 0; i < 3; i++ { wg.Add(1) //创建一个协程,记录一次 go worker(i) } wg.Wait() //同步等待所有的协程全部执行完成 fmt.Println("All done !") }func worker(i int) { fmt.Println(i) time.Sleep(time.Second * time.Duration(i)) wg.Done() //携程结束,从记录中移除等同于Add(-1)}
输出:
2 1 0 All done !
作者:freelang
链接:https://www.jianshu.com/p/0c72863dfc00
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦