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. MySQL数据库干货分享!mysql每月自动创建表结构

    如果你刚好在学MySQL,博主推荐一套很详细的MySQL教程 主要详细讲解了MySQL的相关知识,包括MySQL概述,MySQL应用环境,MySQL系统特性,MySQL初学基础,MySQL管理工具,如 ...

  2. Vue.js入门及其常用指令

    一.Vue框架 https://cn.vuejs.org/ 官网 前端领域有三大框架 Angular诞生于2009年,是由谷歌公司创建出来的框架: React诞生于2013年,是由facebook公司 ...

  3. vue-cli 各文件夹的用途

  4. 【手打】coredns单台使用

    目录: coredns介绍 coredns安装 corendns配置 coredns介绍 CoreDNS 其实就是一个 DNS 服务,而 DNS 作为一种常见的服务发现手段,所以很多开源项目以及工程师 ...

  5. hdu2056 矩形重叠面积(水题)

    题意:       给你两个矩形,问你他们的重叠面积是多少. 思路:      这两个矩形是平行x和y轴的,所以水题,不解释. #include<stdio.h> typedef stru ...

  6. Intel汇编语言程序设计学习-第四章 数据传送、寻址和算术运算-下

    4.3  和数据相关的操作符和伪指令 操作符和伪指令并非机器可执行的指令,相反,它们是由汇编器进行解释的.开发者可以使用一系列的MASM操作符或伪指令获取数据的地址以及大小等特征信息: OFFSET操 ...

  7. 深入浅出带你玩转sqlilabs(二)

    MYSQL高权限注入 mysql跨库注入 详情请看上一篇:深入浅出带你玩转sqlilabs(一) mysql文件操作注入-sqlilabs less7 可能用到的函数: into outfile()函 ...

  8. (转)VMware中桥接模式与NAT模式的区别

    bridged networking(桥接模式) 在这样的模式下.VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它能够訪问网内不论什么一台机器. 在桥接模式下.你须要手工为虚拟系统配置 ...

  9. 【Android Jetpack高手日志】DataBinding 从入门到精通

    前言 DataBinding 数据绑定库是 Android Jetpack 的一部分,借助该库可以使用声明性格式(而非程序化地)将布局中的界面组件绑定到应用中的数据源.我个人觉得,使用 DataBin ...

  10. Web中的相对路径和绝对路径

    前台路径:浏览器端发起的资源请求路径 后台路径:服务器端发起的资源请求路径