Golang控制子gorutine退出,并阻塞等待所有子gorutine全部退出
Golang控制子gorutine退出,并阻塞等待所有子gorutine全部退出
需求
程序有时需要自动重启或者重新初始化一些功能,就需要退出之前的所有子gorutine,并且要等待所有子gorutine全部退出,以下demo可以提供思路
实现demo
package main
import (
"fmt"
"sync"
"time"
)
func main() {
channal1 := make(chan bool,3)
wg := new(sync.WaitGroup)
wg.Add(3)
go g1(channal1,wg)
go g2(channal1,wg)
go g3(channal1,wg)
time.Sleep(time.Second * 10)
channal1 <- true
channal1 <- true
channal1 <- true
wg.Wait()
fmt.Println("++++>>>>all gorutine finish...<<<<++++")
close(channal1)
}
func g1(c chan bool,wg *sync.WaitGroup) {
i := 0
for{
select {
case <- c:
fmt.Printf("@@@---->>>>>g1 end<<<<<----+++\n")
wg.Done()
return
default:
i++
fmt.Printf("+++>>>>>g1 working---%d---<<<<<+++\n",i)
}
time.Sleep(time.Second * 2)
}
}
func g2(c chan bool,wg *sync.WaitGroup) {
i := 0
for{
select {
case <- c:
fmt.Printf("@@@---->>>>>g2 end<<<<<----+++\n")
wg.Done()
return
default:
i++
fmt.Printf("+++>>>>>g2 working---%d---<<<<<+++\n",i)
}
time.Sleep(time.Second * 2)
}
}
func g3(c chan bool,wg *sync.WaitGroup) {
i := 0
for{
select {
case <- c:
fmt.Printf("@@@---->>>>>g3 end<<<<<----+++\n")
wg.Done()
return
default:
i++
fmt.Printf("+++>>>>>g3 working---%d---<<<<<+++\n",i)
}
time.Sleep(time.Second * 2)
}
}
运行结果
+++>>>>>g2 working---1---<<<<<+++
+++>>>>>g1 working---1---<<<<<+++
+++>>>>>g3 working---1---<<<<<+++
+++>>>>>g2 working---2---<<<<<+++
+++>>>>>g1 working---2---<<<<<+++
+++>>>>>g3 working---2---<<<<<+++
+++>>>>>g2 working---3---<<<<<+++
+++>>>>>g1 working---3---<<<<<+++
+++>>>>>g3 working---3---<<<<<+++
+++>>>>>g2 working---4---<<<<<+++
+++>>>>>g1 working---4---<<<<<+++
+++>>>>>g3 working---4---<<<<<+++
+++>>>>>g2 working---5---<<<<<+++
+++>>>>>g3 working---5---<<<<<+++
+++>>>>>g1 working---5---<<<<<+++
@@@---->>>>>g2 end<<<<<----+++
@@@---->>>>>g1 end<<<<<----+++
@@@---->>>>>g3 end<<<<<----+++
++++>>>>all gorutine finish...<<<<++++
Golang控制子gorutine退出,并阻塞等待所有子gorutine全部退出的更多相关文章
- golang中如何阻塞等待所有goroutines都完成
有一天,一个人问了我此问题,回头仔细翻阅了一下资料,仔细的想了一下,这个问题的解决有两种方案.方案一:也是推荐方案,也是官方推荐方案,涉及到一个写并发经常关注的模块sync模块,利用里面的sync.W ...
- Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程
Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程 一丶获取进程以及父进程的pid 含义: 进程在内存中开启多个,操作系统如何区分这些进程, ...
- 八、阻塞等待异步结果FutureTask
一.简介 默认的异步任务有些难以控制,有时候我们希望在当前线程获取异步任务的结果.FutureTask可以帮助我们实现 JDK文档:http://tool.oschina.net/uploads/ap ...
- JUC 并发编程--06, 阻塞队列(7种), 阻塞等待 api的 代码验证
这些队列的 api ,就是添加队列,出队列,检测对首元素, 由于 add()--remove(), offer()--poll(),太简单这里不做验证, 只验证后二组api: 阻塞等待( put()- ...
- 移动端框架篇-控制子容器的滑屏框架-fullPage.js
控制子容器法 方法是只显示其中一个子元素,其它隐藏,滑屏时隐藏当前元素,并显示当前元素的下一个同辈元素~ 这里采用fullPage框架,库大小7.69K~ fullPage框架的页面样式无需自定义,已 ...
- Dynamic CRM 2013学习笔记(十八)根据主表状态用JS控制子表自定义按钮
有时要根据主表的审批状态来控制子表上的按钮要不要显示,比如我们有一个需求审批通过后就不能再上传文件了. 首先打开Visual Ribbon Editor, 如下图,我们可以利用Enable Rules ...
- CSS3 04. 伸缩布局、设置主轴,侧轴方向、主/侧轴对齐方式、 伸缩比例、元素换行、换行控制、覆盖父元素的align-items;控制子元素顺序、web字体、突变字体
CSS3 在布局方面做了非常大的改进,对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开发中可以发挥极大的作用.(兼容性不好) 必要元素: 指定一个盒子为伸缩盒子 displa ...
- c#等待所有子线程执行完毕方法
当我们在使用线程中,你会发现主线结束后子线程的结果才显示出来.现在我要等待所以子线程结束,然后在显示结果,怎么做呢? 方法如下: 1.使用 ManualResetEvent,代码如下: using ...
- Java多线程--让主线程等待所有子线程执行完毕
数据量很大百万条记录,因此考虑到要用多线程并发执行,在写的过程中又遇到问题,我想统计所有子进程执行完毕总共的耗时,在第一个子进程创建前记录当前时间用System.currentTimeMillis() ...
随机推荐
- mysql order by 多样依照排序
如果先按a排序升序,a相同时按b降序排序 则order by a,b desc
- ELK 在 MacOS( Big Sur) 上安装与配置步骤
ELK学习笔记 - 安装篇 目录 ELK学习笔记 - 安装篇 1. ElasticSearch 1.1 发展历史及现状 1.2 ElasticSearch 的安装 2. Logstash 2.1 Lo ...
- 2Spring对象创建小结
Spring的对象创建 Spring学习笔记 周芋杉2021/5/15 原理:工厂设计模式,通过反射创建对象. Spring工厂分类 非web环境:ClassPathXmlApplicationCon ...
- [转载]虚拟化之KVM配置
虚拟化之KVM配置 2017-11-06 [TOC] 虚拟化:通过虚拟化工具把cpu,内存,硬盘等真实硬件资源给模拟成更少的虚拟硬件资源.进行虚拟化的好处是,最大限度的利用硬件资源.也是云计算的基础. ...
- Oracle和MySQL差异总结
常用功能差异 锁差异: • Oracle锁加在数据块上 • InnoDB 是在索引上加锁,所以MySQL锁的粒度没有Oracle 精细. 导入导出: • Oracle采用EXP /IMP ,EXPDP ...
- 常见判断错误 (Day_30)
写给自己的话: 这是一个卡了我小半天的BUG,也是一个很低端的BUG,写篇博客吧,以后回来看看,会发现曾经的自己是如何的菜. 同样,以此记录我的进步 步入正题,这是我实现多条件分页时遇到的一个BUG, ...
- mysql mysqladmin常用命令
修改root密码 mysqladmin -u root -p123456 password 'YOURNEWPASSWORD' 检查mysql是否在运行 systemctl status mariad ...
- 趣谈网络协议-第3讲 | ifconfig:最熟悉又陌生的命令行
如何查看IP地址呢? windows 查看IP地址命令 IPCONFIG LINUX 查看IP 命令 IFCONFIG IP ADDR ifconfig 和ADDR的区别 这是一个 ...
- Go语言网络通信---连续通信的UDP编程
Server: package main import ( "fmt" "net" ) func main() { //创建udp地址 udpAddr, _ : ...
- GO语言面向对象07---面向对象练习02
package main import "fmt" /* ·定义接口IPerson,定义吃喝睡三个抽象方法: ·定义一个IPerson的实现类Person,实现吃喝睡方法; ·定义 ...