GO语言基础进阶教程:sync包——WaitGroup
官网文档对sync包的介绍:
Package sync provides basic synchronization primitives such as mutual exclusion locks. Other than the Once and WaitGroup types, most are intended for use by low-level library routines. Higher-level synchronization is better done via channels and communication.
sync是synchronization同步这个词的缩写,所以也会叫做同步包。这里提供了基本同步的操作,比如互斥锁等等。这里除了Once和WaitGroup类型之外,大多数类型都是供低级库例程使用的。更高级别的同步最好通过channel通道和communication通信来完成
一、WaitGroup
WaitGroup,同步等待组。
在类型上,它是一个结构体。一个WaitGroup的用途是等待一个goroutine的集合执行完成。主goroutine调用了Add()方法来设置要等待的goroutine的数量。然后,每个goroutine都会执行并且执行完成后调用Done()这个方法。与此同时,可以使用Wait()方法来阻塞,直到所有的goroutine都执行完成。
二、Add()方法:
Add这个方法,用来设置到WaitGroup的计数器的值。我们可以理解为每个waitgroup中都有一个计数器用来表示这个同步等待组中要执行的goroutin的数量。
如果计数器的数值变为0,那么就表示等待时被阻塞的goroutine都被释放,如果计数器的数值为负数,那么就会引发恐慌,程序就报错了。
三、Done()方法
Done()方法,就是当WaitGroup同步等待组中的某个goroutine执行完毕后,设置这个WaitGroup的counter数值减1。
其实Done()的底层代码就是调用了Add()方法:
// Done decrements the WaitGroup counter by one.
func (wg *WaitGroup) Done() {wg.Add(-1)
}
四、Wait()方法
Wait()方法,表示让当前的goroutine等待,进入阻塞状态。一直到WaitGroup的计数器为零。才能解除阻塞,这个goroutine才能继续执行。
五、示例代码:
我们创建并启动两个goroutine,来打印数字和字母,并在main goroutine中,将这两个子goroutine加入到一个WaitGroup中,同时让main goroutine进入Wait(),让两个子goroutine先执行。当每个子goroutine执行完毕后,调用Done()方法,设置WaitGroup的counter减1。当两条子goroutine都执行完毕后,WaitGroup中的counter的数值为零,解除main goroutine的阻塞。
示例代码:
package main
import ("fmt""sync"
)
var wg sync.WaitGroup // 创建同步等待组对象
func main() {/*WaitGroup:同步等待组可以使用Add(),设置等待组中要 执行的子goroutine的数量,在main 函数中,使用wait(),让主程序处于等待状态。直到等待组中子程序执行完毕。解除阻塞
子gorotuine对应的函数中。wg.Done(),用于让等待组中的子程序的数量减1*///设置等待组中,要执行的goroutine的数量wg.Add(2)go fun1()go fun2()fmt.Println("main进入阻塞状态。。。等待wg中的子goroutine结束。。")wg.Wait() //表示main goroutine进入等待,意味着阻塞fmt.Println("main,解除阻塞。。")
}
func fun1() {for i:=1;i<=10;i++{fmt.Println("fun1.。。i:",i)}wg.Done() //给wg等待中的执行的goroutine数量减1.同Add(-1)
}
func fun2() {defer wg.Done()for j:=1;j<=10;j++{fmt.Println("\tfun2..j,",j)}
}
运行结果:
GOROOT=/usr/local/go #gosetup
GOPATH=/Users/ruby/go #gosetup
/usr/local/go/bin/go build -i -o /private/var/folders/kt/nlhsnpgn6lgd_q16f8j83sbh0000gn/T/___go_build_demo05_waitgroup_go /Users/ruby/go/src/l_goroutine/demo05_waitgroup.go #gosetup
/private/var/folders/kt/nlhsnpgn6lgd_q16f8j83sbh0000gn/T/___go_build_demo05_waitgroup_go #gosetup
fun1.。。i: 1
fun1.。。i: 2
fun1.。。i: 3
fun1.。。i: 4
fun1.。。i: 5
fun1.。。i: 6
fun1.。。i: 7
fun1.。。i: 8
fun1.。。i: 9
fun1.。。i: 10
main进入阻塞状态。。。等待wg中的子goroutine结束。。fun2..j, 1fun2..j, 2fun2..j, 3fun2..j, 4fun2..j, 5fun2..j, 6fun2..j, 7fun2..j, 8fun2..j, 9fun2..j, 10
main,解除阻塞。。
Process finished with exit code 0
GO语言基础进阶教程:sync包——WaitGroup相关推荐
- go get 的不再src目录中_GO语言基础进阶教程:包的使用
Go语言使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得& ...
- GO语言基础进阶教程:sync包——读写锁
官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...
- GO语言基础进阶教程:sync包——互斥锁
官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...
- go 怎么等待所有的协程完成_GO语言基础进阶教程:Go语言的协程——Goroutine
Go语言的协程--Goroutine 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为&qu ...
- Go语言基础进阶—程序结构—包和文件
基于Go语言圣经总结,适合有一定基础的同学,对于提升Go语言的掌握有很大的帮助 建议放大观看
- 《C语言程序设计进阶教程》一导读
前 言 为什么要写这本书 本文讲的是C语言程序设计进阶教程一导读,市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书 ...
- Markdown语言基础使用教程
Markdown语言基础使用教程 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber ...
- echarts折线图y轴根据数值自动_R语言基础绘图教程——第3章:折线图和带状图...
教程代码和文件,关注本公众号,后台回复:R语言基础绘图代码 R基础教程可先阅读:R语言编程基础第一篇:语法基础 利用plot()绘制 在上一章中我们讲过plot()绘图的基本结构,主要通过type参数 ...
- sync包——WaitGroup
官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...
最新文章
- usaco Preface Numbering 序言页码
- 文明,在于传承,而不在于遗忘。
- Git remote 修改源
- 信用卡不能提额,是因为使用了招联金融吗?
- python 回溯法 子集树模板 系列 —— 1、8 皇后问题
- es6 数组合并_JavaScript学习笔记(十九)-- ES6
- php文件上传到虚拟主机,php源码上传到虚拟主机(php源码上传到服务器)
- php清空dns缓存文件,怎么清除DNS缓存
- centos php71,CentOS 71编译安装PHP7
- input 限制只能输入数字,且保留小数后两位
- HDU2501 Tiling_easy version【递推+打表】
- 李践《行动日志——目标管理》观后感
- 如何理解STM32单片机引脚的复用功能?
- ATMC/ATMP是啥?
- 【转载】NP完全问题——最小曼哈顿网络
- Python之Sqlitespy连接并把Excel内容写到数据库的表中
- 【华人学者风采】余家国 武汉理工大学
- 华为---ACL配置
- vue-loader无法解析vue里的stylus的style,外部引入styl文件可以解析,引入VueLoaderPlugin也没用
- synaptics触摸板新驱动强势更新[附下载]!