官网文档对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相关推荐

  1. go get 的不再src目录中_GO语言基础进阶教程:包的使用

    Go语言使用包(package)这种语法元素来组织源码,所有语法可见性均定义在package这个级别,与Java .python等语言相比,这算不上什么创新,但与C传统的include相比,则是显得& ...

  2. GO语言基础进阶教程:sync包——读写锁

    官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...

  3. GO语言基础进阶教程:sync包——互斥锁

    官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...

  4. go 怎么等待所有的协程完成_GO语言基础进阶教程:Go语言的协程——Goroutine

    Go语言的协程--Goroutine 进程(Process),线程(Thread),协程(Coroutine,也叫轻量级线程) 进程进程是一个程序在一个数据集中的一次动态执行过程,可以简单理解为&qu ...

  5. Go语言基础进阶—程序结构—包和文件

    基于Go语言圣经总结,适合有一定基础的同学,对于提升Go语言的掌握有很大的帮助 建议放大观看

  6. 《C语言程序设计进阶教程》一导读

    前 言 为什么要写这本书 本文讲的是C语言程序设计进阶教程一导读,市面上有成百上千种关于编程的书籍,其中有很多都是关于C语言编程的,那么为什么我还要写这本书呢?为什么建议你花时间读它呢?这本书跟其他书 ...

  7. Markdown语言基础使用教程

    Markdown语言基础使用教程 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber ...

  8. echarts折线图y轴根据数值自动_R语言基础绘图教程——第3章:折线图和带状图...

    教程代码和文件,关注本公众号,后台回复:R语言基础绘图代码 R基础教程可先阅读:R语言编程基础第一篇:语法基础 利用plot()绘制 在上一章中我们讲过plot()绘图的基本结构,主要通过type参数 ...

  9. sync包——WaitGroup

    官网文档对sync包的介绍: Package sync provides basic synchronization primitives such as mutual exclusion locks ...

最新文章

  1. usaco Preface Numbering 序言页码
  2. 文明,在于传承,而不在于遗忘。
  3. Git remote 修改源
  4. 信用卡不能提额,是因为使用了招联金融吗?
  5. python 回溯法 子集树模板 系列 —— 1、8 皇后问题
  6. es6 数组合并_JavaScript学习笔记(十九)-- ES6
  7. php文件上传到虚拟主机,php源码上传到虚拟主机(php源码上传到服务器)
  8. php清空dns缓存文件,怎么清除DNS缓存
  9. centos php71,CentOS 71编译安装PHP7
  10. input 限制只能输入数字,且保留小数后两位
  11. HDU2501 Tiling_easy version【递推+打表】
  12. 李践《行动日志——目标管理》观后感
  13. 如何理解STM32单片机引脚的复用功能?
  14. ATMC/ATMP是啥?
  15. 【转载】NP完全问题——最小曼哈顿网络
  16. Python之Sqlitespy连接并把Excel内容写到数据库的表中
  17. 【华人学者风采】余家国 武汉理工大学
  18. 华为---ACL配置
  19. vue-loader无法解析vue里的stylus的style,外部引入styl文件可以解析,引入VueLoaderPlugin也没用
  20. synaptics触摸板新驱动强势更新[附下载]!

热门文章

  1. 《当程序员的那些狗日日子》(五十六)步入正轨
  2. Linux 配置crash
  3. 诛仙 第一集 第八章 传艺
  4. c++ enum 给定类型_讲解C++中的枚举类型以及声明新类型的方法
  5. 指标归因平台建设思路
  6. Python爬虫自学系列(五)
  7. UiPath官网认证培训
  8. Android Google Maps API教程-入门
  9. 乔布斯的演讲——求知若饥,虚心若愚
  10. 企查查爬虫python实现(二)报错与细节