Golang中超简单的协程同步工具
从需求出发
现在有如下需求:多协程处理一批数据,但需要所有协程都跑完才可以继续下一步,这个需求在日常的处理数据中非常常见。多协程可以最大限度的压榨CPU和IO,但从业务角度来看,又需要保持一致性,这个时候我们就需要协程同步技术。
流程图解
从下图可以看到在3个协程运行的时间都不可控,但为了达到同步的目的,需要等待3个携程全部跑完再继续下面的流程。

image
解
sync.waitgroupAdd(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 !