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. LeetCode43,一题让你学会高精度算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode系列第22篇文章,今天讲的内容是高精度算法. 今天和大家讨论的算法是高精度,对应的LeetCode是第43题.题面其实 ...

  2. shell脚本基础-四种启动方式

    1.当前路径启动 ./test.sh 2.绝对路径启动 pwd /data/beijing 'pwd'/test.sh 3.指定解释器执行 sh test.sh bash test.sh 4.shel ...

  3. ketika aku 病毒

    #客户中了该病毒,本想找病毒样本来看看,可是没找到样本,发现中这个病毒的案例还是相对较少: #国内好像没有对于该病毒没有比较详尽的病毒信息,特此写一下方便后者: #中招表现:目前所能够发现的是能够对浏 ...

  4. 如何获取主键返回值(MySQL、Oracle)

    添加用户.返回主键 --场景:在执行新增用户sql后,service层返回新增用户的主键值(与mybatis一起使用) insert into user(username, sex, birthday ...

  5. django中基于python3.6使用容联发送短信

    一. Django基于python3.6使用容联发送短信流程 容联官方的python支持2.7版本,当我们python解释器采用3版本时,需要修改容联接口中的一些参数及方法. 首先去容联官网注册账号, ...

  6. [BFS,大水题] Codeforces 198B Jumping on Walls

    题目:http://codeforces.com/problemset/problem/198/B Jumping on Walls time limit per test 2 seconds mem ...

  7. Redis 按正则获取keys

    首先,我被坑了很久由于不知道这个redis支持的正则只有3种 1. * 任意长度的任意字符 2. ? 任意单一字符 3. [xxx] 匹配方括号中的一个字符 2.从上面开来,keys的模糊匹配功能很方 ...

  8. 使用Keras进行深度学习:(二)CNN讲解及实践

    欢迎大家关注我们的网站和系列教程:http://www.tensorflownews.com/,学习更多的机器学习.深度学习的知识! 现今最主流的处理图像数据的技术当属深度神经网络了,尤其是卷积神经网 ...

  9. nginx使用手册+基本原理+优缺点

    一.nginx优点 1.反向代理 1.正向代理: 客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原 ...

  10. jQuery操作DOM的相关方法

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