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. KEIL编译出现错误“source file is not valid utf-8”

    实际情况是: .h文件一直报错source file is not valid utf-8的错误, 原因就是: 文件中出现了一个中文的“:”导致的.总结就是:如出现此类错误,可能是字符不够标准.

  2. C++ 深拷贝和浅拷贝详解

    前言 在对象拷贝过程中,如果没有自定义拷贝构造函数,系统会提供一个缺省的拷贝构造函数,缺省的拷贝构造函数对于基本类型的成员变量,按字节复制,对于类类型成员变量,调用其相应类型的拷贝构造函数. 位拷贝( ...

  3. 【面试必备】用了那么多次 ping,是时候知道 ping 是如何工作的了!

    每日一句英语学习,每天进步一点点: 前言 在日常生活或工作中,我们在判断与对方网络是否畅通,使用的最多的莫过于 ping 命令了. “那你知道 ping 是如何工作的吗?” —— 来自小林的灵魂拷问 ...

  4. eclipse 配置tomcat运行环境

    eclipse环境下如何配置tomcat,并且把项目部署到Tomcat服务器上 1.打开Eclipse,单击“Window”菜单,选择下方的“Preferences”. 2.单击“Server”选项, ...

  5. 记一次有趣的thinkphp代码执行

    0x00 前言 朋友之前给了个站,拿了很久终于拿下,简单记录一下. 0x01 基础信息 漏洞点:tp 5 method 代码执行,payload如下 POST /?s=captcha _method= ...

  6. demo08-js条件运算符

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. 【NLP面试QA】预训练模型

    目录 自回归语言模型与自编码语言 Bert Bert 中的预训练任务 Masked Language Model Next Sentence Prediction Bert 的 Embedding B ...

  8. Javascript之盒子拖拽(跟随鼠标、边界限定、轨迹回放)

    本文通过拖拽案例,实现"跟随鼠标.边界限定.轨迹回放"三大效果: 完整代码中有详尽注释,故不再进行细致讲解: 对于案例中需要注意的重点或易错点问题,会总结在最后. 效果图(仅演示左 ...

  9. c#委托、泛型委托和匿名方法

    题外话:别指望看第一遍书就能记住和掌握什么——请看第二遍.第三遍. 本人女猿一枚,2年工作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知自身能力薄弱,如表达错误.不当之处请园友们多多指出,互相交 ...

  10. vim-0-indent(缩进)

    缩进: 参考自http://liuzhijun.iteye.com/blog/1831548,http://blog.csdn.net/chenxiang6891/article/details/41 ...