golang中的WaitGroup
简介
不要把增加其计数器值的操作和调用其Wait方法的代码,放在不同的 goroutine 中执行。换句话说,要杜绝对同一个WaitGroup值的两种操作的并发执行
WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。
sync.WaitGroup只有3个方法,Add(),Done(),Wait()。
其中Done()是Add(-1)的别名。简单的来说,使用Add()添加计数,Done()减掉一个计数,计数不为0, 阻塞Wait()的运行。
也可以通过这种方式创建
wg := new(sync.WaitGroup)
Add 用来添加 goroutine 的个数
Done 执行一次数量减 1
Wait 用来等待结束
例子
同时开三个协程去请求网页, 等三个请求都完成后才继续 Wait 之后的工作
var wg sync.WaitGroup
var urls = []string{"http://www.golang.org/","http://www.google.com/","http://www.somestupidname.com/",
}
for _, url := range urls {// Increment the WaitGroup counter. wg.Add(1)// Launch a goroutine to fetch the URL. go func(url string) {// Decrement the counter when the goroutine completes. defer wg.Done()// Fetch the URL. http.Get(url)}(url)
}
// Wait for all HTTP fetches to complete.
wg.Wait()
或者下面的代码
用于测试 给chan发送 1千万次,并接受1千万次的性能
import ("fmt""sync""time"
)const (num = 10000000
)func main() {TestFunc("testchan", TestChan)
}func TestFunc(name string, f func()) {st := time.Now().UnixNano()f()fmt.Printf("task %s cost %d \r\n", name, (time.Now().UnixNano()-st)/int64(time.Millisecond))
}func TestChan() {var wg sync.WaitGroupc := make(chan string)wg.Add(1)go func() {for _ = range c {}wg.Done()}()for i := 0; i < num; i++ {c <- "123"}close(c)wg.Wait()
}
golang中的WaitGroup相关推荐
- Golang中WaitGroup使用的一点坑
Golang中WaitGroup使用的一点坑 Golang 中的 WaitGroup 一直是同步 goroutine 的推荐实践.自己用了两年多也没遇到过什么问题.直到一天午睡后,同事扔过来一段奇怪的 ...
- php协程和goroutine,golang中四种方式实现子goroutine与主协程的同步
如何实现子goroutine与主线程的同步 第一种方式:time.sleep(),这种方式很太死板,就不演示了. 第二种方式:使用channel机制,每个goroutine传一个channel进去然后 ...
- golang中的sync.WaitGroup
golang中的sync.WaitGroup Posted on 2015/04/09刚才看golang的sync的包,看见一个很有用的功能.就是WaitGroup. 先说说WaitGroup的用途: ...
- Golang中WaitGroup、Context、goroutine定时器及超时学习笔记
原文连接:http://targetliu.com/2017/5/2... 好久没有发过文章了 - -||,今天发一篇 golang 中 goroutine 相关的学习笔记吧,以示例为主. WaitG ...
- 进一步认识golang中的并发
如果你成天与编程为伍,那么并发这个名词对你而言一定特别耳熟.需要并发的场景太多了,例如一个聊天程序,如果你想让这个聊天程序能够同时接收信息和发送信息,就一定会用到并发,无论那是什么样的并发. 并发的意 ...
- golang中并发sync和channel
golang中并发sync和channel chenbaoke · 2014-12-08 13:00:01 · 19151 次点击 · 预计阅读时间 5 分钟 · 不到1分钟之前 开始浏览 这是一个创 ...
- go语言os.exit(1)_在Golang中各种永远阻塞的姿势
在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...
- Golang中各种永远阻塞的方法
在Golang中各种永远阻塞的姿势 Go的运行时的当前设计,假定程序员自己负责检测何时终止一个goroutine以及何时终止该程序. 可以通过调用os.Exit或从main()函数的返回来以正常方式终 ...
- 记一次golang中sync.Map并发创建、读取的问题
记一次golang中sync.Map并发创建.读取的问题 cunfate https://www.jianshu.com/p/f472e79909bc 背景: 我们有一个用go做的项目,其中用到了z ...
最新文章
- 查看mysql编译参数
- oracle自动选择索引
- 在Centos7 更改Docker默认镜像和容器的位置
- 两次秒售罄的小米10,还能火爆多久?
- Java实现MD5加密解密类
- ADSL与路由器密码大全及设置
- 复试c语言笔试题,考研计算机复试(C语言复试笔试题)(精华题选)
- XeLaTeX-中文排版解决方案
- 网课录屏用什么软件好?Camtasia极简操作,课程重点一目了然
- Xmanager4注册码
- 求方程ax^2+bx+c=0的根,用3个函数分别求当b^2-4ac大于0、等于0和小于0时的根,并输出结果。 从主函数输入a, b, c的值。
- 特征工程——用转换器抽取特征
- C/C++ 电脑微信dat文件解密及工具分享
- 银行家算法(C++实现)
- ggplot2简明教程
- ARFoundation之路-光照估计
- 计算机软件 csc csu,4-TS-软件设计说明模板(GJB438A).doc
- 西门子PLC伺服大型20轴程序modbus通讯RS232通讯MES通讯气缸
- 企业财务制度二--(五)损益类科目 5801 以前年度损益调整(转载)
- 设计原则——设计模式基础