Golang中超简单的协程同步工具
image从需求出发
现在有如下需求:多协程处理一批数据,但需要所有协程都跑完才可以继续下一步,这个需求在日常的处理数据中非常常见。多协程可以最大限度的压榨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 !
image
网友评论