美文网首页Golang开发轻松学Golang我爱编程
Golang中超简单的协程同步工具

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

作者: freelang | 来源:发表于2018-07-24 22:38 被阅读23次

    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

    相关文章

      网友评论

        本文标题:Golang中超简单的协程同步工具

        本文链接:https://www.haomeiwen.com/subject/zvcumftx.html