当前位置:网站首页>GoLang 使用 goroutine 停止的几种办法
GoLang 使用 goroutine 停止的几种办法
2022-08-02 23:45:00 【JavaPub-rodert】
博主介绍: 自媒体 JavaPub 独立维护人,全网粉丝15w+,csdn博客专家、java领域优质创作者,51ctoTOP10博主,知乎/掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、
GoLang技术领域和副业。
前言
我们有很多情况下需要主动关闭goroutine,如需要实现一个系统自动熔断的功能就需要主动关闭goroutine
goroutine介绍
goroutine是Go语言实现并发编程的利器,是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理,简单的一个指令go function就能启动一个goroutine;Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。
但是,Go语言并没有提供终止goroutine的接口,也就是说,我们不能从外部去停止一个goroutine,只能由goroutine内部退出(main函数终止除外);
几种停止的办法
1. 使用 for-range
for-range 从 channel 上接收值,直到 channel 关闭,该结构在Go并发编程中很常用,这对于从单一通道上获取数据去执行某些任务是十分方便的
package main
import (
"fmt"
"sync"
)
//源码&面试>>https://javapub.blog.csdn.net/category_11938137.html
var wg sync.WaitGroup //等待组,用来阻塞程序
func worker(ch chan int) {
defer wg.Done() //等待组 -1
for v := range ch {
fmt.Println(v)
}
}
func main() {
ch := make(chan int)
wg.Add(1) //等待组 +1
go worker(ch)
for i := 0; i < 5; i++ {
ch <- i
}
close(ch) //必须要加close,因为在打印完0、1、2、3、4后会发生阻塞,直到chan关闭。
wg.Wait()
}

去掉close的情况

2. 使用 for-select (向退出通道发出退出信号)
当channel比较多时,for-range结构借不是很方便了;
Go语言提供了另外一种和channel相关的语法: select;
select能够让goroutine在多个通信操作上等待(可以理解为监听多个channel);
由于这个特性,for-select结构在Go并发编程中使用的频率很高;
我在使用Go的开发中,这是我用的最多的一种组合形式:
这里用 quit通道接收退出信号。
package main
import (
"fmt"
"sync"
"time"
)
var wg sync.WaitGroup
func worker(in, quit <-chan int) {
defer wg.Done()
for {
select {
case <-quit:
fmt.Println("收到退出信号")
return //必须return,否则goroutine不会结束
case v := <-in:
fmt.Println(v)
}
}
}
func main() {
quit := make(chan int) //退出通道
in := make(chan int)
wg.Add(1)
go worker(in, quit)
for i := 0; i < 3; i++ {
in <- i
time.Sleep(1 * time.Second)
}
quit <- 1 //想通道写入退出信号
wg.Wait()
}


边栏推荐
- 数据库审计 - 网络安全的重要组成部分
- 用了TCP协议,就一定不会丢包吗?
- Heartwarming AI Review (1)
- CKAN教程之在 AWS 上部署 CKAN 应用程序
- 21天学习挑战赛(1)设备树的由来
- 2022 Shandong International Youth Eye Health Industry Exhibition, Vision Health Exhibition, Optometry Exhibition
- Jenkins汉化设置
- Speech Synthesis Model Cheat Sheet (1)
- js基础知识整理之 —— Date和定时器
- Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替
猜你喜欢
随机推荐
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
【代码扫描修复】MD5加密弱HASH漏洞
数据库主键一定要自增吗?有哪些场景不建议自增?
alibaba数据同步组件canal的实践整理
【系统架构设计师】第三章 数据库系统
Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替
典型相关分析CCA计算过程
嵌入式分享合集26
Speech Synthesis Model Cheat Sheet (1)
机电设备制造企业,如何借助ERP系统做好客供料管理?
js基础知识整理之 —— 获取元素和命名规范
Visual Studio中vim模拟器
升级版的冒泡排序:鸡尾酒排序(快乐小时排序)
flutter 时间戳转日期
2022山东国际青少年眼睛健康产业展会,视力健康展,眼视光展
十三、数据回显
十年架构五年生活-05第一次出差
精心整理16条MySQL使用规范,减少80%问题,推荐分享给团队
Jmeter二次开发实现rsa加密
有奖提问|《新程序员》专访“Apache之父”Brian Behlendorf










