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的更多相关文章

  1. Go语言协程并发---互斥锁sync.Mutex

    package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...

  2. Go语言协程并发---读写锁sync.RWMutex

    package main import ( "fmt" "sync" "time" ) /* 读写锁 多路只读 一路只写 读写互斥 */ / ...

  3. Go语言协程并发---管道信号量应用

    package main import ( "fmt" "math" "strconv" "time" ) /* ·10 ...

  4. Go语言协程并发---条件变量

    package main import ( "fmt" "sync" "time" ) func main() { //要监听的变量 bit ...

  5. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  6. Go语言协程并发---原子操作

    package main import ( "fmt" "sync/atomic" ) /* 用原子来替换锁,其主要原因是: 原子操作由底层硬件支持,而锁则由操 ...

  7. Go语言协程并发---timer秒表与定时器

    秒表 package main import ( "fmt" "time" ) /*每秒大喊我要去浪,共9次,然后退出计时*/ func main() { va ...

  8. Go语言协程并发---select多路复用应用

    package main import ( "fmt" "time" ) /* ·循环从一写两读三条管道中随机选择一条能走的路 ·等所有路都走不通了就退出循环 ...

  9. 二、深入asyncio协程(任务对象,协程调用原理,协程并发)

      由于才开始写博客,之前都是写笔记自己看,所以可能会存在表述不清,过于啰嗦等各种各样的问题,有什么疑问或者批评欢迎在评论区留言. 如果你初次接触协程,请先阅读上一篇文章初识asyncio协程对asy ...

随机推荐

  1. 计算机网络——RIP协议:距离向量算法

    路由信息协议(RIP)是内部网关协议(IGP)中使用最广泛的一种协议,它是一种分布式.基于距离向量的路由选择协议,其特点是协议简单.它要求路由器周期性地向外发送路由刷新报文.路由刷新报文主要内容是由若 ...

  2. Selenium3自动化测试【15】元素定位之Class、Name

    @ 目录 1.name定位 2.class定位 1.name定位 通过name定位是另外一种常用的定位元素的方式. 当一个元素存在name属性时,可以使用name定位,依旧以Bing搜索框为例(nam ...

  3. 『动善时』JMeter基础 — 6、使用JMeter发送一个最基础的请求

    目录 步骤1:创建一个测试计划 步骤2:创建线程组 步骤3:创建取样器 步骤4:创建监听器 步骤5:完善信息 步骤6:保存测试计划 步骤7:查看结果 总结:JMeter测试计划要素 当我们第一次打开J ...

  4. hdu4081 最小树+DFS或者次小树的变形

    题意:       给你一个全图,在里面找到一棵树,这棵树最多只有一条边可以不是最小树(也可以是), 要求 那对特殊的边的两个权值/除了这条边其他边的和最大. 思路:      方法有很多,最少有三种 ...

  5. hdu2846 字典树(带id的)

    题意:      给你一些模式串,然后给你一些提问,每个提问是给你一个串,问你这个串在上 面的模式串中出现的次数. 思路:       一开始想到hash,但是因为用的是map,所以超时了,map的操 ...

  6. DexHunter在ART虚拟机模式下的脱壳原理分析

    本文博客地址: http://blog.csdn.net/qq1084283172/article/details/78494620 DexHunter脱壳工具在Dalvik虚拟机模式下的脱壳原理分析 ...

  7. Git(2)多人协同操作冲突

    一:多人协同操作冲突 拉取远程dev并在本地创建dev开发库,执行命令git checkout -b  dev  origin/dev  这里以同台机器不同窗口来模拟俩个用户操作同一分支同一文件(实际 ...

  8. JAVA教程 Java学习路线

  9. php基础-php基本语法

    http://study.163.com/course/courseMain.htm?courseId=246003

  10. 15 个让新手爱不释手的 Python 高级库

    为什么我喜欢 Python ? 对于初学者来说,这是一种简单易学的编程语言:另一个原因:大量开箱即用的第三方库,正是 23 万个由用户提供的软件包使得 Python 真正强大和流行 在本文中,我挑选了 ...