go 怎么等待所有的协程完成_怎么关闭golang协程
怎么关闭golang协程
发布时间:2020-06-10 10:43:33
来源:亿速云
阅读:284
作者:Leah
这篇文章给大家分享的是关闭golang协程的方法。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。
1、通过Channel传递退出信号
channel作为go的一种基本数据类型,它有3种基本状态:nil、open、closed。
通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样:func run(done chan int) {
for {
select {
case
fmt.Println("exiting...")
done
break
default:
}
time.Sleep(time.Second * 1)
fmt.Println("do something")
}
}
func main() {
c := make(chan int)
go run(c)
fmt.Println("wait")
time.Sleep(time.Second * 5)
c
fmt.Println("main exited")
}
2、使用waitgroup
通常情况下,我们像下面这样使用waitgroup:
1、创建一个Waitgroup的实例,假设此处我们叫它wg
2、在每个goroutine启动的时候,调用wg.Add(1),这个操作可以在goroutine启动之前调用,也可以在goroutine里面调用。当然,也可以在创建n个goroutine前调用wg.Add(n)
3、当每个goroutine完成任务后,调用wg.Done()
4、在等待所有goroutine的地方调用wg.Wait(),它在所有执行了wg.Add(1)的goroutine都调用完wg.Done()前阻塞,当所有goroutine都调用完wg.Done()之后它会返回。
示例:type Service struct {
// Other things
ch chan bool
waitGroup *sync.WaitGroup
}
func NewService() *Service {
s := &Service{
// Init Other things
ch: make(chan bool),
waitGroup: &sync.WaitGroup{},
}
return s
}
func (s *Service) Stop() {
close(s.ch)
s.waitGroup.Wait()
}
func (s *Service) Serve() {
s.waitGroup.Add(1)
defer s.waitGroup.Done()
for {
select {
case
fmt.Println("stopping...")
return
default:
}
s.waitGroup.Add(1)
go s.anotherServer()
}
}
func (s *Service) anotherServer() {
defer s.waitGroup.Done()
for {
select {
case
fmt.Println("stopping...")
return
default:
}
// Do something
}
}
func main() {
service := NewService()
go service.Serve()
// Handle SIGINT and SIGTERM.
ch := make(chan os.Signal)
signal.Notify(ch, syscall.SIGINT, syscall.SIGTERM)
fmt.Println(
// Stop the service gracefully.
service.Stop()
}
关于关闭golang协程的方法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
go 怎么等待所有的协程完成_怎么关闭golang协程相关推荐
- python3 协程 写法_理解Python的协程(Coroutine)
由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...
- 生产排程系统_高级计划与排程的基本概念
基于高级排程的供应链优化 高级计划与排程的基本概念 高级计划与排程(Advanced Planning and Scheduling,简称" APS" ),是解决生产排程和生产调度 ...
- go 怎么等待所有的协程完成_优雅地等待子协程执行完毕
goroutine模拟了线程级别的返场的能力,但它的执行需要主协程给机会.一般的作法用sleep,chan阻塞,看起来让人不爽,本文介绍sync.WaitGroup 类型结合 defer 的特性,给出 ...
- golang 协程同步 简介
目录 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup 协程概念简要理解 协程类似线程,是一种更为轻量级的调度单位,但协程还是不同于线程的,线程是系 ...
- python多线程多进程多协程_python 多进程、多线程、协程
1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...
- python中协程与函数的区别_深入浅析python 协程与go协程的区别
进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...
- python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...
一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...
- Python与Golang协程异同
背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...
- golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理
1 01 引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发). 1.1 进程和 ...
最新文章
- Java堆栈功能_【ThinkingInJava】35、用java实现堆栈功能
- Netbackup 添加策略_报NFS.Skipping
- Jquery给基本控件的取值、赋值
- IdentityServer4(六)授权码流程原理之SPA
- 用toad实现oracle数据迁移,Oracle 使用TOAD实现导入导出Excel数据
- 【转】make makefile cmake qmake都是什么,有什么区别?
- go-plugin入门
- 传销组织生化环材说(正论)
- 以太坊新生合约总数骤减;比特币大跌,本周主链排名震荡 | 数据周榜
- 老单位领导直属领导有恩,新公司薪水给的高,怎么选?
- 【经典递归问题 汉诺塔 求解】
- 怎样采集百家论坛MP3讲座
- FPGA参数定义 regwire 详解
- 嵌入式c语言精华,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇
- 中国婚博会PHP高级工程师、安全顾问汤青松:浅析Web安全编程
- Android Studio制作.so库实践
- php 7 current time,PHP检查当前时间(PHP check current time)
- android studio 如何下载指定版本的NDK
- vsphere虚拟化备份解决方案
- matlab仿真浊度传感器,Arduino Turbidity sensor浊度传感器模块
热门文章
- java开发的主流_盘点2019年Java开发中7项主流、热门的IT技术!
- java 每秒处理1000个请求_每秒处理请求数和并发是一个概念吗?
- as it exceeds the max of 500KB._我的英雄学院The “Ultra” Stage角色介绍第三弹!
- linux fstab 权限,linux中fstab文件配置简介
- 动态数据的国际化、几种主要的国际化标签
- Java编码规范注意
- 基于JAVA+SpringBoot+Mybatis+MYSQL的药店进销存管理系统
- 基于JAVA+SpringMVC+MYSQL的苗木销售系统
- 基于JAVA+SpringMVC+Mybatis+MYSQL的账单管理系统
- c语言二叉树的构造输出,C语言数据结构树状输出二叉树,谁能给详细的解释一下...