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() ...
随机推荐
- 拦截器(Interceptor)与过滤器(Filter)
目录 用户的普通Http请求执行顺序 过滤器.拦截器添加后的执行顺序 拦截器(Interceptor)的基本定义 拦截器(Interceptor)必须实现的三个方法 单个拦截器(Interceptor ...
- 【BUAA软工】提问回顾与个人总结
链接到以前提问题的博客 在之前的博客我曾经提问过以下几个问题 为什么单元测试必须由写程序的人完成? 过早优化,过早泛华:何时为过早? 为何使用goto语句? 用户需求分析:分而治之,如何分? 兼容性测 ...
- [MySQL数据库之记录的详细操作:增、改、删、单表查询、多表查询]
[MySQL数据库之记录的详细操作:增.改.删.单表查询.多表查询] 记录详细操作 增.删.改 增: insert t1(字段1,字段2,字段3) values (值1,值2,值3), (值1,值2, ...
- Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd)
Linux下获取当前的目录,需执行以下命令: $(cd `dirname $0`;pwd) 其中, dirname $0,取得当前执行的脚本文件的父目录 cd `dirname $0` ...
- 保存 yum 下载的软件包并制作成本地 yum 源
保存 yum 下载的软件包并制作成本地 yum 源 实验对象 CentOS 7 yum 安装 nginx (nginx必须使用第三源才能安装:redhat8版本的则不需要,官网源自带nginx软件包) ...
- touch -d 同时修改atime与mtime
1.touch命令 touch命令用于创建空白文件或设置文件的时间,格式为"touch [选项] [文件]". 在创建空白的文本文件方面,这个touch命令相当简捷,简捷到没有必要 ...
- debian用户手册-20200317
https://www.debian.org/doc/manuals/debian-reference/ 文档与使用手册在每一个操作系统中都是很重要的一部份,是描述程序操作和使用的技术手册.正由于说明 ...
- OS_FLAG_GRP_DEPLETED
178 * OS_FLAG_GRP_DEPLETED 系统没有剩余的空闲事件标志组,需要更改OS_CFG.H中 179 * 的事件标志组数目配置创建 标志组的时候返回这个错误 打印出错误代码后发现是1 ...
- STM32 库函数 延时函数计算
- 报错: Uncaught TypeError: Cannot read property 'prototype' of undefined(Day_43)
报错原因 引入的js顺序错误,elementUI需要依赖于Vue,调整顺序即可. 调整后