怎么关闭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协程相关推荐

  1. python3 协程 写法_理解Python的协程(Coroutine)

    由于GIL的存在,导致Python多线程性能甚至比单线程更糟. GIL: 全局解释器锁(英语:Global Interpreter Lock,缩写GIL),是计算机程序设计语言解释器用于同步线程的一种 ...

  2. 生产排程系统_高级计划与排程的基本概念

    基于高级排程的供应链优化 高级计划与排程的基本概念 高级计划与排程(Advanced Planning and Scheduling,简称" APS" ),是解决生产排程和生产调度 ...

  3. go 怎么等待所有的协程完成_优雅地等待子协程执行完毕

    goroutine模拟了线程级别的返场的能力,但它的执行需要主协程给机会.一般的作法用sleep,chan阻塞,看起来让人不爽,本文介绍sync.WaitGroup 类型结合 defer 的特性,给出 ...

  4. golang 协程同步 简介

    目录 协程概念简要理解 为什么要做同步 协程的几种同步方法 Mutex channel WaitGroup 协程概念简要理解 协程类似线程,是一种更为轻量级的调度单位,但协程还是不同于线程的,线程是系 ...

  5. python多线程多进程多协程_python 多进程、多线程、协程

    1.python的多线程 多线程就是在同一时刻执行多个不同的程序,然而python中的多线程并不能真正的实现并行,这是由于cpython解释器中的GIL(全局解释器锁)捣的鬼,这把锁保证了同一时刻只有 ...

  6. python中协程与函数的区别_深入浅析python 协程与go协程的区别

    进程.线程和协程 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定义: 操作系统能够进行运算调度的最小单位.它被包含在进 ...

  7. python 协程可以嵌套协程吗_Python线程、协程探究(2)——揭开协程的神秘面纱...

    一.上集回顾 在上一篇中我们主要研究了python的多线程困境,发现多核情况下由于GIL的存在,python的多线程程序无法发挥多线程该有的并行威力.在文章的结尾,我们提出如下需求: 既然python ...

  8. Python与Golang协程异同

    背景知识 这里先给出一些常用的知识点简要说明,以便理解后面的文章内容. 进程的定义: 进程,是计算机中已运行程序的实体.程序本身只是指令.数据及其组织形式的描述,进程才是程序的真正运行实例. 线程的定 ...

  9. golang 数组 最后一个_面试必问:Golang高阶Golang协程实现原理

    1 01 引言 实现并发编程有进程,线程,IO多路复用的方式.(并发和并行我们这里不区分,如果CPU是多核的,可能在多个核同时进行,我们叫并行,如果是单核,需要排队切换,我们叫并发). 1.1 进程和 ...

最新文章

  1. Java堆栈功能_【ThinkingInJava】35、用java实现堆栈功能
  2. Netbackup 添加策略_报NFS.Skipping
  3. Jquery给基本控件的取值、赋值
  4. IdentityServer4(六)授权码流程原理之SPA
  5. 用toad实现oracle数据迁移,Oracle 使用TOAD实现导入导出Excel数据
  6. 【转】make makefile cmake qmake都是什么,有什么区别?
  7. go-plugin入门
  8. 传销组织生化环材说(正论)
  9. 以太坊新生合约总数骤减;比特币大跌,本周主链排名震荡 | 数据周榜
  10. 老单位领导直属领导有恩,新公司薪水给的高,怎么选?
  11. 【经典递归问题 汉诺塔 求解】
  12. 怎样采集百家论坛MP3讲座
  13. FPGA参数定义 regwire 详解
  14. 嵌入式c语言精华,【精华整理】C语言嵌入式系统编程修炼--键盘操作篇
  15. 中国婚博会PHP高级工程师、安全顾问汤青松:浅析Web安全编程
  16. Android Studio制作.so库实践
  17. php 7 current time,PHP检查当前时间(PHP check current time)
  18. android studio 如何下载指定版本的NDK
  19. vsphere虚拟化备份解决方案
  20. matlab仿真浊度传感器,Arduino Turbidity sensor浊度传感器模块

热门文章

  1. java开发的主流_盘点2019年Java开发中7项主流、热门的IT技术!
  2. java 每秒处理1000个请求_每秒处理请求数和并发是一个概念吗?
  3. as it exceeds the max of 500KB._我的英雄学院The “Ultra” Stage角色介绍第三弹!
  4. linux fstab 权限,linux中fstab文件配置简介
  5. 动态数据的国际化、几种主要的国际化标签
  6. Java编码规范注意
  7. 基于JAVA+SpringBoot+Mybatis+MYSQL的药店进销存管理系统
  8. 基于JAVA+SpringMVC+MYSQL的苗木销售系统
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的账单管理系统
  10. c语言二叉树的构造输出,C语言数据结构树状输出二叉树,谁能给详细的解释一下...