当前位置:网站首页>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()
}
边栏推荐
猜你喜欢
Cholesterol-PEG-Amine,CLS-PEG-NH2,胆固醇-聚乙二醇-氨基脂两亲性脂质衍生物
js基础知识整理之 —— 全局作用域
电压传感器: 工作原理、类型及电路图
公司招个程序员,34岁以上两年一跳的不要,开出工资以为看错了
What is the matter that programmers often say "the left hand is knuckled and the right hand is hot"?
VMware workstation program starts slowly
脂溶性胆固醇-聚乙二醇-叠氮,Cholesterol-PEG-Azide,CLS-PEG-N3
Day117. Shangyitong: Generate registered order module
程序员的七夕浪漫时刻
CAS:474922-22-0,DSPE-PEG-MAL,磷脂-聚乙二醇-马来酰亚胺科研试剂供应
随机推荐
Test | ali internship 90 days in life: from the perspective of interns, talk about personal growth
机器学习-特征映射方法
Nacos配置中心之事件订阅
即席查询—— Kylin使用
【QT】自定义工程封装成DLL并如何调用(带ui界面的)
Nuxt 所有页面都设置上SEO相关标签
记一次sql优化Using temporary; Using filesort
Auto.js 特殊定位控件方法 不能在ui线程执行阻塞操作,请使用setTimeout代替
几种常见的跨域解决方法
主流定时任务解决方案全横评
Day117.尚医通:生成挂号订单模块
漫画:怎么证明sleep不释放锁,而wait释放锁?
华为设备配置BFD与接口联动(触发与BFD联动的接口物理状态变为Down)
DataGuard日常维护常见问题之数据同步异常
js基础知识整理之 —— Date和定时器
【软考 系统架构设计师】软件架构设计① 软件架构的概念
我为什么又能面试一次就拿到offer
4、Citrix MCS云桌面无法安装todesk等软件
嵌入式分享合集26
js基础知识整理之 —— 获取元素和命名规范