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
sync包——WaitGroup相关推荐
- GO语言基础进阶教程:sync包——WaitGroup
官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...
- 并发安全Sync包的使用
有时候在Go代码中可能会存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态).Sync包主要实现了并发任务同步WaitGroup的几种方法和并发安全的互斥锁和读写锁 ...
- 面试官让我用channel实现sync包里的同步锁,是不是故意为难我?
前言 Go语言提供了channel和sync包两种并发控制的方法,每种方法都有他们适用的场景,并不是所有并发场景都适合应用channel的,有的时候用sync包里提供的同步原语更简单.今天这个话题纯属 ...
- Go语言sync包的应用详解
在并发编程中同步原语也就是我们通常说的锁的主要作用是保证多个线程或者 goroutine在访问同一片内存时不会出现混乱的问题.Go语言的sync包提供了常见的并发编程同步原语,上一期转载的文章< ...
- 从项目的一个 panic 说起:Go 中 Sync 包的分析应用
项目开发中遇到一个错误 "fatal error: concurrent map read and map write". 有过一两年 Golang 开发经验的同学应该都不陌生,这 ...
- 4.12 并发技术:sync包同步调度综合案例
同步调度概述 Go语言的并发中,当使用go关键字开辟若干新的协程时,如果不加干涉,它们会完全并发地得到执行: 而所谓调度,就是在并发的局部植入一些串行和同步的操作,让某些协程有逻辑上的先后关系: 执行 ...
- sync包——互斥锁
官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...
- 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 ...
最新文章
- a1278 win10声卡驱动_windows安装系列教程—驱动安装
- oracle into多个变量,Oracle中merge into的使用:该命令使用一条语句从一个或者多个数据源中完成对表的更新和插入数据....
- 为利用 QT 制作的项目设置图标
- ffmpeg 硬件解码rtsp流_树莓派使用硬件加速视频转码
- 功率谱和频谱的区别、联系
- wps如何交叉引用多个文献_WPS中引用参考文献的设置
- Ubuntu 14.04中修复默认启用HDMI后没有声音的问题
- Python二:【ImageEnhance】+【PIL模块】如何利用python实现图像增强
- 【二十三】win 10 :Jmeter 报告可视化 —— 配置生成测试报告仪表板,Jmeter + Jenkins 自动化构建生成 HTML 报告
- linux 文件可视化工具下载,Linux 可视化管理工具
- 香农编码的gui编码_1、香农编码方法
- fullpage.js版本3.0.9报错问题(licenseKey)
- 智能家居普及的最大障碍:如何“排座次”
- 算法探讨——再议经典算法问题:求最大子序列和、绝对值最大子序列和以及其区间...
- springboot-vue前后端分离登录
- SolidWorks快速安装螺栓
- Linux 4.15亮点特性
- 【NumPy中数组创建】
- 个性化智能推荐技术研究总结
- pytorch学习--UNet模型