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

freelang · · 1818 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:freelang

查看原文:Golang中超简单的协程同步工具

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1818 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传