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 ...
随机推荐
- gitlab支持https最简单方法
gitlab支持https方法 使用gitlab内部nginx直接支持https 通过外部nginx代理(本次使用的方法) 访问流程外部nginx--->gitlab的gitlab_workho ...
- spring boot @Schedule 如何定时请求任务
spring boot 定时任务,添加两个注解即可: 1,启动类添加:@EnableScheduling 2,方法上添加注解:@Scheduled(cron = "0/5 * * * * ? ...
- 【新手/零基础】Hexo+Gitee个人博客搭建教程--详细版
前言 点此转到--精简版 可能很多小伙伴都有搭建一个属于自己的博客的想法.但是经常是无奈于自己匮乏的知识.但是,每个老手都是新手过来的,再困难的事情,只要肯花一点时间都可以办成. 本次教程分为详细版和 ...
- php与mysql 绑定变量和预定义处理
非select 语句(没有结果集的) 1.建立连接数据库 $mysqli=new mysqli("localhost","root","", ...
- hdu4869 费马小+快速幂
思路:费马小+快速幂 无论怎么翻,每一步的1出现的可能个数的奇偶性是一样的,因为奇数 - 偶数 = 奇数,偶数 - 偶数 = 偶数,有一张牌被重叠了,那么就减去一个偶数2,所以怎么重叠都不 ...
- RING3级下枚举用户进程的基本姿势
简述 Ring3用户态下查看进程信息的基本方法 代码样例 #include <cstdio> #include <iostream> #include <cstdlib& ...
- Intel汇编语言程序设计学习-第二章 IA-32处理器体系结构-下
2.2 IA-32处理器体系结构 如前所述,IA-32是指始于Intel386直到当前最新的奔腾4的系列的处理器(额...这本书是什么时候写的啊,表示现在应该是I7啊),在IA-32的发展过程中,I ...
- jquery简单实现tab选项卡效果
html: <ul class="tab"> <li>最新</li> <li class="cur">热门< ...
- 用最容易的方式学会单链表(Python实现)
单链表与数组 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列也会有如下缺点: 一个动态数组的长度可能超过实际存储数组元素所需 ...
- Redis数据结构—链表与字典的结构
目录 Redis数据结构-链表与字典的结构 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 Redis字典的使用 Re ...