Golang中超简单的协程同步工具


从需求出发

现在有如下需求:多协程处理一批数据,但需要所有协程都跑完才可以继续下一步,这个需求在日常的处理数据中非常常见。多协程可以最大限度的压榨CPU和IO,但从业务角度来看,又需要保持一致性,这个时候我们就需要协程同步技术。

流程图解

从下图可以看到在3个协程运行的时间都不可控,但为了达到同步的目的,需要等待3个携程全部跑完再继续下面的流程。

https://img3.sycdn.imooc.com/5d5df42c0001553508250145.png

image

sync.waitgroup
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 !