iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > GO >GoLang使goroutine停止的五种方法实例
  • 465
分享到

GoLang使goroutine停止的五种方法实例

2024-04-02 19:04:59 465人浏览 泡泡鱼
摘要

目录1.Goroutine停止介绍2.goroutine停止的5种方法2.1使用for-range2.2使用for-select(向退出通道发出退出信号)2.3使用for-selec

golang之使goroutine停止的5种方法

1.goroutine停止介绍

goroutine是Go语言实现并发编程的利器,简单的一个指令go function就能启动一个goroutine;

但是,Go语言并没有提供终止goroutine的接口,也就是说,我们不能从外部去停止一个goroutine,只能由goroutine内部退出(main函数终止除外);

我们有很多情况下需要主动关闭goroutine,如需要实现一个系统自动熔断的功能就需要主动关闭goroutine

2.goroutine停止的5种方法

2.1使用for-range

for-range从channel上接收值,直到channel关闭,该结构在Go并发编程中很常用,这对于从单一通道上获取数据去执行某些任务是十分方便的

2.2使用for-select(向退出通道发出退出信号)

当channel比较多时,for-range结构借不是很方便了;

Go语言提供了另外一种和channel相关的语法: select;

select能够让goroutine在多个通信操作上等待(可以理解为监听多个channel);

由于这个特性,for-select结构在Go并发编程中使用的频率很高;

我在使用Go的开发中,这是我用的最多的一种组合形式:

for {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->
select {<!--{C}%3C!%2D%2D%20%2D%2D%3E-->
}
}

对于for-select结构,一般我会定义一个特定的退出通道,用于接收退出的信号,如quit

2.3使用for-select(关闭退出通道)

当我们就需要向quit通道中发送100次数据,如果再用以上的代码就很麻烦,有一个很简单的方法,关闭channel,这样所有监听quit channel的goroutine就都会收到关闭信号,上面的代码只要做一个很小的替换就能工作

2.4使用for-select(关闭多个channel)

如果select上监听了多个通道,需要所有的通道都关闭后才能结束goroutine,这里就利用select的一个特性,select不会在nil的通道上进行等待,因此将channel赋值为nil即可,此外,还需要利用channel的ok值

var wg sync.WaitGroup
func worker(in1, in2 <-chan int) {
	defer wg.Done()
	for {
		select {
		case v, ok := <-in1:
			if !ok {
				fmt.Println("收到退出信号")
				in1 = nil
			}
			// do something
			fmt.Println(v)
		case v, ok := <-in2:
			if !ok {
				fmt.Println("收到退出信号")
				in2 = nil
			}
			// do something
			fmt.Println(v)
		}
		// select已经结束,我们需要判断两个通道的状态
		// 都为nil则结束当前goroutine
		if in1 == nil && in2 == nil {
			return
		}
	}
}
func main() {
	in1 := make(chan int) // 退出通道,接收
	in2 := make(chan int)
	wg.Add(2)
	go worker(in1, in2)
	go worker(in2, in2)
	for i := 0; i < 3; i++ {
		in1 <- i
		time.Sleep(1 * time.Second)
		in2 <- i
	}
	close(in1)
	close(in2)
	wg.Wait()
}

2.5使用context包

context包是官方提供的一个用于控制多个goroutine写作的包;

使用context的cancel信号,可以终止goroutine的运行,context是可以向下传递的

总结

到此这篇关于GoLang使goroutine停止的五种方法的文章就介绍到这了,更多相关GoLang goroutine停止内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

您可能感兴趣的文档:

--结束END--

本文标题: GoLang使goroutine停止的五种方法实例

本文链接: https://www.lsjlt.com/news/164249.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • GoLang使goroutine停止的五种方法实例
    目录1.goroutine停止介绍2.goroutine停止的5种方法2.1使用for-range2.2使用for-select(向退出通道发出退出信号)2.3使用for-selec...
    99+
    2024-04-02
  • Java停止线程的3种方法
    目录1.自定义中断标识符2.interrupt中断线程3.stop停止线程总结在 Java 中停止线程的实现方法有以下 3 种: 自定义中断标识符,停止线程。使用线程中断方法 int...
    99+
    2024-04-02
  • 谈谈Golang停止运行的几种情况与处理方法
    Golang是一门非常流行的编程语言,被广泛应用于各种系统和领域中。在开发过程中,Golang的运行出现停止是比较常见的情况,而了解停止的原因和处理方法是我们开发人员必须掌握的技能之一。本文将探讨Golang停止运行的几种情况和处理方法。一...
    99+
    2023-05-14
  • 详解Java停止线程的四种方法
    一、线程停止基础知识 interrupted(): 测试当前线程是否已经中断。该方法为静态方法,调用后会返回boolean值。不过调用之后会改变线程的状态,如果是中断状态...
    99+
    2024-04-02
  • html5使音乐停止的方法
    这篇文章将为大家详细讲解有关html5使音乐停止的方法,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。html5使音乐停止的方法:首先创建一个HTML示例文件;然后通过“onclick="docu...
    99+
    2023-06-15
  • C++ 字符串的反转五种方法实例
    复制代码 代码如下://通过不同的方法,实现对所输入字符串的反转,可以很好地复习巩固 C++ 基础知识//直接使用字符数组赋值char* strrev1(const char* st...
    99+
    2022-11-15
    C++ 字符串 反转
  • PHP停止进程的四种方法是什么
    这篇文章主要讲解了“PHP停止进程的四种方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP停止进程的四种方法是什么”吧!第一种方法是使用exit()函数这个函数可以让程序立即停止...
    99+
    2023-07-05
  • Java实现单例模式的五种方法介绍
    目录饿汉式懒汉式双重检查锁静态内部类内部枚举类实现饿汉式 立即加载 防止new对象,构造私有,写一个公共的方法返回对象 占用空间,线程安全 public class Singleto...
    99+
    2023-01-31
    Java单例模式 Java单例模式实现方式
  • GoLang读取文件的10种方法实例
    目录一. 整个文件读入内存1.直接指定文化名读取1.1使用os.ReadFile函数读取文件2.先创建句柄再读取2.1使用os.OpenFile函数只读形式获取句柄2.2代码讲解二....
    99+
    2024-04-02
  • Java单例模式的五种实现方式
    目录前言饿汉单例懒汉单例非线程安全的懒汉单例加同步锁的懒汉单例双重检验懒汉单例静态内部类静态内部类为什么是线程安全总结前言 单例模式(Singleton Pattern)是 Java...
    99+
    2024-04-02
  • XP系统无法停止通用卷设备的多种实用解决方法
    第一种方法: 一个国外的十分小巧实用的软件,只有191KB,叫unlocker,十分好用! 这个软件能解锁USB连接设备!就能实现100%安全删除USB连接了! 第二种方法: 我们只需要把系统的预览功能关掉,这种问题就不...
    99+
    2023-06-02
    XP系统 停止通用卷设备 实用 解决 设备 系统 XP
  • Golang停止运行的情况与处理方法有哪些
    这篇文章主要讲解了“Golang停止运行的情况与处理方法有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Golang停止运行的情况与处理方法有哪些”吧!一、内存泄漏内存泄漏是Golang...
    99+
    2023-07-05
  • redis的五种数据类型使用方法
    redis 提供五种数据类型:字符串:存储单个字符串值。哈希表:存储键值对,用于对象或映射。列表:存储有序元素序列,用于数组或队列。集合:存储不重复元素,用于唯一值或标签。有序集合:存储...
    99+
    2024-04-19
    redis 键值对
  • 3种PHP实现四舍五入的方法
    1. 使用内置函数round():```$num = 12.3456789;$rounded_num = round($num, 2...
    99+
    2023-08-24
    PHP
  • javascript遍历对象的五种方式实例代码
    目录准备 五种武器 for…in Object.keys Object.getOwnPropertyNames Object.getOwnPropertySymbols Reflec...
    99+
    2024-04-02
  • Python实现单例模式的五种写法总结
    目录使用模块使用装饰器基于 __new__ 方法实现基于 metaclass 方式实现单例模式(Singleton Pattern) 是一种常用的软件设计模式,该模式的主要目的是确保...
    99+
    2024-04-02
  • Java实现List去重的五种方法详解
    目录通过HashSet去重(不保证顺序)通过HashSet去重(保证顺序)遍历后判断赋给另一个list集合去重(保证顺序)通过TreeSet去重(保证顺序)Java8中Stream流...
    99+
    2022-11-13
    Java List去重方法 Java List去重 Java去重 List 去重
  • 多种方法解决win7使用过程中提示已停止工作问题
      在使用WIN7系统的时候大家可能经常遇到过各种“已停止工作”的提示,如ie已停止工作、word停止工作等等诸如此类的程序错误,非常烦人,那么怎么解决这个问题呢小编下面提供4种处理方案,某些方法...
    99+
    2023-06-01
    win7 已停止工作 过程 使用 工作 问题
  • 如何批量删除Docker中已经停止的容器的几种方法
    目录方法一:方法二: 方法三:方法四:附图:方法一: #显示所有的容器,过滤出Exited状态的容器,取出这些容器的ID, sudo docker ps -a|grep ...
    99+
    2024-04-02
  • MySQL时间盲注的五种延时方法实现
    MySQL时间盲注五种延时方法 (PWNHUB 非预期解) 延时注入函数 五种:sleep(),benchmark(t,exp),笛卡尔积,GET_LOCK() RLIKE正则 sl...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作