Go语言协程并发---等待组sync.WaitGroup
package main import (
"fmt"
"sync"
"time"
) /*等待组API介绍*/
func main071() {
var wg sync.WaitGroup
fmt.Println(wg) //向等待组添加一个协程(注册)
wg.Add(1) //从等待组减掉一个协程(注销)
wg.Done() //阻塞等待至等待组中的协程数归零
wg.Wait()
} /*
·分别使用Ticker和Timer创建耗时协程A,B
·将A,B,C两个协程加入等待组
·A,B,C结束时从等待组注销
·主协程阻塞至等待组内协程数归零
*/ func main() {
//声明等待组
var wg sync.WaitGroup //每开辟一个协程就向等待组中+1
wg.Add(1)
go func() {
fmt.Println("协程A开始工作")
time.Sleep(3 * time.Second)
fmt.Println("协程A over") //协程结束,从等待组中注销(协程数-1)
wg.Done()
}() //每开辟一个协程就向等待组中+1
wg.Add(1)
go func() {
fmt.Println("协程B开始工作")
//timer := time.NewTimer(3 * time.Second)
//<- timer.C
<-time.After(5 * time.Second)
fmt.Println("协程B over") //协程结束,从等待组中注销(协程数-1)
wg.Done()
}() //每开辟一个协程就向等待组中+1
wg.Add(1)
go func() {
fmt.Println("协程C开始工作")
ticker := time.NewTicker(time.Second)
for i := 0; i < 4; i++ {
<-ticker.C
}
ticker.Stop()
fmt.Println("协程C over") //协程结束,从等待组中注销(协程数-1)
wg.Done()
}() //阻塞等待wg中的协程数归零
wg.Wait()
fmt.Println("main over")
}
Go语言协程并发---等待组sync.WaitGroup的更多相关文章
- Go语言协程并发---互斥锁sync.Mutex
package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...
- Go语言协程并发---读写锁sync.RWMutex
package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...
- Go语言协程并发---管道信号量应用
package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...
- Go语言协程并发---条件变量
package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bit ...
- Go语言协程并发---生产者消费者实例
package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...
- Go语言协程并发---原子操作
package main import ( "fmt" "sync/atomic" ) /* 用原子来替换锁,其主要原因是: 原子操作由底层硬件支持,而锁则由操 ...
- Go语言协程并发---timer秒表与定时器
秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...
- Go语言协程并发---select多路复用应用
package main import ( "fmt" "time" ) /* ·循环从一写两读三条管道中随机选择一条能走的路 ·等所有路都走不通了就退出循环 ...
- 二、深入asyncio协程(任务对象,协程调用原理,协程并发)
由于才开始写博客,之前都是写笔记自己看,所以可能会存在表述不清,过于啰嗦等各种各样的问题,有什么疑问或者批评欢迎在评论区留言. 如果你初次接触协程,请先阅读上一篇文章初识asyncio协程对asy ...
随机推荐
- k8s kubernetes 集群 证书更新操作
转载自https://www.cnblogs.com/kuku0223/p/12978716.html 1. 各个证书过期时间 /etc/kubernetes/pki/apiserver.crt #1 ...
- Summary: DOM modification techniques
Modifying an existing element We covered various ways that you can modify aspects of an existing ele ...
- Linux在shell终端中清空DNS缓存,刷新DNS的方法
现在很多Linux发行版都没有内置DNS本地缓存,Linux不像Windows那样可以使用ipconfig /flushdns来刷新,在Linux下无需刷新,因为本身没有缓存. 前言 在Linux系统 ...
- hdu4535
题意: 吉哥系列故事--礼尚往来 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) To ...
- 手动脱Mole Box V2.6.5壳实战
作者:Fly2015 这个程序是吾爱破解脱壳练习第8期的加壳程序,该程序的壳是MoleBox V2.6.5壳,之前也碰过该种壳但是这个程序似乎要复杂一点. 首先对加壳程序进行侦壳处理. Exeinfo ...
- 修改Android手机内核,绕过反调试
本文博客链接:http://blog.csdn.net/qq1084283172/article/details/57086486 0x1.手机设备环境 Model number: Nexus 5 O ...
- RHCE7 认证之学习笔记
-------------------------------------------------------------------------------------------初始化:两台服务器 ...
- json对象的获取
<script type="text/javascript"> var person = { //json对象定义开始 name:'tom', //字符串 age:24 ...
- HashSet添加操作底层判读(Object类型)
Object类型添加操作判读 第一步:程序首先创建一个Object泛型的Set数组,这里用到了上转型: 第二步:执行object里面的add添加方法,传进的值为"JAVA": 首先 ...
- 检查dtd和Xschema文件限制下的xml文件是否符合的Java文件
先来xml文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!DOCTYPE orders SY ...