wait_group

sync.WaitGroup 类型是并发安全的,也是开箱就能用的。 该类型有三个指针方法,即:Add,Done和Wait.

sync.WaitGroup是一个结构体类型。其中一个代表计数的字节数组类型的字段,该 字段用4字节表示给定计数,另4字节表示等待计数。当一个sync.WaitGroup类型的变 量被声明之后,其中的这两个计数都会是0。可以通过add方法增大或减少其中给定计数, 例如:

wg.Add()
wg.Add(-)
需要注意的是,我们不能让这个计数值变成一个负数。
wg.Done()

相当于

wg.Add(-)

我们知道add和done方法可以变更计数器的值,但是变更之后具体有什么 作用呢?

当调用sync.WaitGroup类型值的Wait方法时,它会去检查给定计数。如果 该计数为0,那么该方法会立即返回,且不会对程序产生任何影响。但是, 如果这个计数器大于0,该方法调用所在的那个goroutine就会阻塞,同时 等待计数器会加1。直到在该值的add或done方法被调用时给定计数变回0. 该值才会去唤醒因此等待而阻塞的所有goroutine,同时清零等待计数。

现在我们有一个案例: 假设程序启用了4个goroutine,分别是g1,g2,g3,g4。其中g2,g3,g4是由代码g1 启用的,g1启用之后并且要等待这些特殊任务的完成。

使用通道来进行阻塞

  sign := make(chan int, )
go func() {
sign <-
fmt.Println()
}()
go func() {
sign <-
fmt.Println()
}() go func() {
sign <-
fmt.Println()
}() for i := ; i < ; i++ {
fmt.Println("执行", <-sign)
}
使用通道的有过于繁重了,原则上,我们不应该把通道当做互斥锁或信号量来使用。

使用waitGroup

var wg sync.WaitGroup

    wg.Add()
go func() {
wg.Done()
fmt.Println()
}()
go func() {
wg.Done()
fmt.Println()
}()
go func() {
wg.Done()
fmt.Println()
}() wg.Wait()
fmt.Println("1 2 3 4 end")

参考:go并发编程实战

go 中的WaitGroup的更多相关文章

  1. Go中由WaitGroup引发对内存对齐思考

    转载请声明出处哦~,本篇文章发布于luozhiyun的博客:https://www.luozhiyun.com 本文使用的go的源码时14.4 WaitGroup使用大家都会,但是其中是怎么实现的我们 ...

  2. Golang中WaitGroup使用的一点坑

    Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...

  3. go中waitGroup源码解读

    waitGroup源码刨铣 前言 WaitGroup实现 noCopy state1 Add Wait 总结 参考 waitGroup源码刨铣 前言 学习下waitGroup的实现 本文是在go ve ...

  4. 进一步认识golang中的并发

    如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟.需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发. 并发的意 ...

  5. Go中的并发编程和goroutine

    并发编程对于任何语言来说都不是一件简单的事情.Go在设计之初主打高并发,为使用者提供了goroutine,使用的方式虽然简单,但是用好却不是那么容易,我们一起来学习Go中的并发编程. 1. 并行和并发 ...

  6. Go语言 WaitGroup 详解

    你必须非常努力,才能看起来毫不费力! 微信搜索公众号[ 漫漫Coding路 ],一起From Zero To Hero ! 前言 在前面的文章中,我们使用过 WaitGroup 进行任务编排,Go语言 ...

  7. 四种方式实现子goroutine与主线程的同步

    如何实现子goroutine与主线程的同步 第一种方式: 这种方式很太死板,就不演示了. 第二种方式:使用 channel机制,每个 goroutine传一个 channel进去然后往里写数据,在再主 ...

  8. Java程序员的Golang入门指南(下)

    Java程序员的Golang入门指南(下) 4.高级特性 上面介绍的只是Golang的基本语法和特性,尽管像控制语句的条件不用圆括号.函数多返回值.switch-case默认break.函数闭包.集合 ...

  9. 如何优雅地等待所有的goroutine退出

    转自:https://www.cnblogs.com/cobbliu/p/4461866.html goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力.但是 ...

随机推荐

  1. [Visual Basic]冒泡排序及优化

    冒泡排序 注意点 越界问题:i的边界是n-1,也就是说是对总共的第1~n个数进行排列(最后一个数处于被比较状态,不需要额外主动比较):j的初始值或最终值与当前i的值 有关题目中往往会改变i的值来考察, ...

  2. Natas20 Writeup(Session登录,注入参数)

    Natas20: 读取源码,发现把sessionID存到了文件中,按键值对存在,以空格分隔,如果$_SESSION["admin"]==1,则成功登陆,得到flag.并且通过查询所 ...

  3. Natas10 Writeup(正则表达式、grep命令)

    Natas10: 页面与上一关类似,只是增加了提示“出于安全原因,我们现在过滤某些字符”. 查看源码,发现关键代码如下: $key = ""; if(array_key_exist ...

  4. Python专题——详解enumerate和zip

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题的第7篇文章,我们继续介绍迭代相关. enumerate 首先介绍的是enumerate函数. 在我们日常编程的过程当 ...

  5. C++ 类的继承和派生

    继承的优点:减少代码的冗余 提高代码的重用性 派生类定义格式: Class 派生类名 : 继承方式 基类名{ //派生类新增的数据成员和成员函数 }; class 子类: 继承方式 父类名{ //子类 ...

  6. Thinkphp绕过宝塔getshell

    可以看到直接被拦了,经测试这里是敏感函数字符拦截,大部分有用的敏感函数都被拦了,这里面被拦的是phpinfo() Emmmm,怎么办呢..... 直接执行代码不行,那么就写入代码吧,用file_put ...

  7. jwt token认证

    目录 1.drf-jwt手动签发与校验 2.drf小组件:过滤.筛选.排序.分页 => 针对与群查接口 jwt_token源码分析(入口) 签发token源码分析 校验token源码分析 url ...

  8. hdu4107Gangster 线段树

    题目链接:http://icpc.njust.edu.cn/Problem/Hdu/4107/ 题目给定一个初始值都是零的序列,操作只有一种,就是给一个区间加上一个数,但是当一个数大于等于给定的P的时 ...

  9. 洛谷 P3909 异或之积 题解

    原题链接 本人看了其它解法,发现本人的解法还是 首创 ! 而且我的解法好像和 \(\times 6\) 没什么关系 -- (如果没 \(\times 6\),我没还不用算逆元) 别人的思路呢,大都是从 ...

  10. 我的Keras使用总结(3)——利用bottleneck features进行微调预训练模型VGG16

    Keras的预训练模型地址:https://github.com/fchollet/deep-learning-models/releases 一个稍微讲究一点的办法是,利用在大规模数据集上预训练好的 ...