golang 中 sync包的 WaitGroup
golang 中的 sync 包有一个很有用的功能,就是 WaitGroup
先说说 WaitGroup 的用途:它能够一直等到所有的 goroutine 执行完成,并且阻塞主线程的执行,直到所有的 goroutine 执行完成。
WaitGroup 总共有三个方法:Add(delta int), Done(), Wait()。简单的说一下这三个方法的作用。
Add:添加或者减少等待 goroutine 的数量
Done:相当于Add(-1)
Wait:执行阻塞,直到所有的WaitGroup数量变成 0
请看例子:
package main import (
"fmt"
"sync"
"time"
) func main() {
var wg sync.WaitGroup for i := ; i < ; i = i + {
wg.Add()
go func(n int) {
// defer wg.Done()
defer wg.Add(-)
EchoNumber(n)
}(i)
} wg.Wait()
} func EchoNumber(i int) {
time.Sleep(3e9)
fmt.Println(i)
}
结果如下所示:
程序很简单,只是将每次循环的数量过 3秒钟 输出。那么,这个程序如果不用 WaitGroup,那么将看不见输出结果。因为 goroutine 还没执行完,主线程已经执行完毕。注释的 defer wg.Done() 和 defer wg.Add(-1) 作用一样。这个很好,原来执行脚本,都是使用 time.Sleep,用一个估计的时间等到子线程执行完。WaitGroup 很好。虽然 chanel 也能实现,但是觉得如果涉及不到子线程与主线程数据同步,这个感觉不错。
golang 中 sync包的 WaitGroup的更多相关文章
- golang中sync.RWMutex和sync.Mutex区别
golang中sync包实现了两种锁Mutex (互斥锁)和RWMutex(读写锁),其中RWMutex是基于Mutex实现的,只读锁的实现使用类似引用计数器的功能. type Mutex f ...
- Go中sync包学习
前面刚讲到goroutine和channel,通过goroutine启动一个协程,通过channel的方式在多个goroutine中传递消息来保证并发安全.今天我们来学习sync包,这个包是Go提供的 ...
- golang 中 sync.Mutex 的实现
mutex 的实现思想 mutex 主要有两个 method: Lock() 和 Unlock() Lock() 可以通过一个 CAS 操作来实现 func (m *Mutex) Lock() { f ...
- Golang学习 - sync 包
------------------------------------------------------------ 临时对象池 Pool 用于存储临时对象,它将使用完毕的对象存入对象池中,在需要 ...
- Go_21: Golang 中 time 包的使用二
常量声明: const TimeLayout = "2006-01-02 15:04:05" 这是个奇葩,必须是这个时间点,据说是 go 诞生之日, 记忆方法:6-1-2-3-4- ...
- Go_20: Golang 中 time 包的使用
time包中包括两类时间:时间点(某一时刻)和时常(某一段时间) 1. 时间常量(时间格式化) const ( ANSIC = "Mon Jan _2 15:04:05 2006" ...
- golang中context包学习
摘要 go语言中goroutine之间的关联关系,缺乏维护,在erlang中有专门的机制来保障新开仟程的生命周期, 在go语言中,只能通过channel + select来实现,但不够直观,感觉很绕. ...
- golang的sync包例子
package main import ( "fmt" "sync" ) var wg sync.WaitGroup func asyncTestFunc() ...
- [Go] golang中的包管理
在配置了环境变量$GOPATH后,比如下面这个路径 export GOPATH=/mnt/f/ubuntu/goProject 在这个路径下面会有这几个目录 在src目录下放着我的源码比如: 在同一个 ...
随机推荐
- 跟踪调试Linux内核的启动过程
跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...
- 任务看板-Monday
工作照
- Teamwork(The fourth day of the team)
在这天我们已经开始去做自己手上的的任务.由于我们都忙于手头上的工作,所以这天我们就没有过多的交流,有的可能就是网上说一下实现到了哪里.
- 【动态规划】POJ-3176
一.题目 Description The cows don't use actual bowling balls when they go bowling. They each take a numb ...
- Unity3D游戏开发——收集当前关卡游戏中分散的物件
运用场景 许多游戏中会有一些供玩家拾起的物件,例如装备.血包.道具等.当玩家与物件进行碰撞后,则会进入仓库. 本篇介绍了简单的碰撞过程. 原理 基本的碰撞机制,用到OnTriggerEnter()碰撞 ...
- 树莓派配置RTC时钟(DS3231,I2C接口)
1.购买基于DS3231的RTC时钟模块,并且支持3.3V的那种 2.配置树莓派 a.打开树莓派的i2c接口 sudo raspi-config -->Interfacing Options - ...
- NET Core Mvc发布带视图文件的方法!
添加节点:<MvcRazorCompileOnPublish>false</MvcRazorCompileOnPublish>
- webpack命令局部运行的几种方法
webpack命令局部运行的几种方法 1. 第一种,先全局安装webpack 命令:npm install -g webpack 然后再在项目内安装 命令:npm install webpack ...
- swusec的构想,顺便送开学福利——校园网一号多登录演示
前言: 我不是什么大牛,我只想通过我的努力,打造swu网络安全爱好者的圈子.期待你加入. swusec是什么? swusec (SouthWestUniversity SecurityTeam),西南 ...
- CentOS 6.5以上版本安装mysql 5.7 完整版教程(修订版)
转载自:https://codeday.me/collect/20170524/21861.html 1: 检测系统是否自带安装mysql # yum list installed | grep my ...