go语言-用channel控制goroutine的退出
用channel控制goroutine的退出
本文简要介绍了,如何用channel控制goroutine的退出的基本方法
for-range主动停止goruitine
package mainimport ("fmt""sync""time"
)/*
Go并发编程模型:主动停止goroutine
方法一:for-rang从channel上接收值,直到channel关闭
*/
var wg sync.WaitGroupfunc work(ch chan int) {defer wg.Done()// for range关键字,将其使用在channel上时,会自动等待channel的动作一直到channel被关闭close// 也就是clase(sh)后,for range就会退出for i := range ch {fmt.Println(i)}fmt.Println("work exit")
}func main() {wg.Add(1)var ch chan intch = make(chan int)go work(ch)for i := 0; i < 3; i++ {time.Sleep(1 * time.Second)ch <- i}time.Sleep(3 * time.Second)for i := 4; i < 7; i++ {time.Sleep(1 * time.Second)ch <- i}// close(sh)来控制"work"协程中的for range的完成close(ch)wg.Wait()
}
后台定时任务
// 设定一个定时器,当定时器触发是就执行一次任务tricker := time.NewTicker(1 * time.Second)defer fmt.Println("tricker.Stop()")defer tricker.Stop()for {select {case <-stopCh:fmt.Println("do1 exit.")return//心跳,心跳一次就执行一次任务case <-tricker.C:time.Sleep(1 * time.Second)fmt.Println("do1 doing....")}}
使用stopCh控制goroutine退出
package mainimport ("fmt""sync""time"
)var wg sync.WaitGroupfunc do1(stopCh chan struct{}) {defer wg.Done()for {select {case <-stopCh:fmt.Println("go1 exit.")returndefault:time.Sleep(1 * time.Second)fmt.Println("go1 doing....")}}
}
func do2(stopCh chan struct{}) {defer wg.Done()for {select {case <-stopCh:fmt.Println("go2 exit.")returndefault:time.Sleep(1 * time.Second)fmt.Println("go2 doing....")}}
}func main() {wg.Add(2)stopCh := make(chan struct{})go do1(stopCh)go do2(stopCh)time.Sleep(5 * time.Second)// 让一个goroutine退出stopCh <- struct{}{}time.Sleep(5 * time.Second)// 让另一个goroutine退出stopCh <- struct{}{}wg.Wait()}
关闭channel来控制goroutine退出
package mainimport ("fmt""sync""time"
)/*
多个通道都关闭才退出
利用select的一个特性,select不会在nil的通道上进行等待
*/
var wg sync.WaitGroupfunc work(in, exit1, exit2 chan bool) {defer wg.Done()for {select {// 当exit管道收到信号后退出goroutinecase v := <-exit1:fmt.Println("exit1 收到退出信号")fmt.Println("v=", v)exit1 = nilcase <-exit2:fmt.Println("exit2 收到退出信号")exit2 = nilcase value := <-in:fmt.Println(value)}fmt.Println(time.Now())fmt.Println("遍历了一次")// 当2个退出通道都收到信号时,就退出for循环if exit1 == nil && exit2 == nil {return}}}func main() {in := make(chan bool)exit1 := make(chan bool)exit2 := make(chan bool)wg.Add(1)go work(in, exit1, exit2)for i := 0; i < 6; i++ {time.Sleep(5 * time.Millisecond)in <- true}// 主动停止goroutine方法一//exit1 <- 1//exit2 <- 1// 主动停止goroutine方法二close(exit1)close(exit2)wg.Wait()}相关文章:
go语言-用channel控制goroutine的退出
用channel控制goroutine的退出 本文简要介绍了,如何用channel控制goroutine的退出的基本方法 for-range主动停止goruitine package mainimport ("fmt""sync""time" )/* Go并发编程模型:主动停止goroutine 方法一&#…...
强大的虚拟机Parallels Desktop 19 mac中文激活
Parallels Desktop是一款功能全面、易于使用的虚拟机软件,它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载:Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力,让用户能够迅…...
单元测试框架深入(一):单元测试框架深入
一、一个简单的例子 1、引入Maven依赖:JUnit框架和Surefire插件 2.在src/test/java目录下新建名字以“Test”结尾的测试类,并用Test注释测试方法 3.运行单元测试用例 或用mvn命令运行单元测试: 二、单元测试基础之单元测试框架:J…...
苏门X学士常识学习
前言 苏轼(1037年—1101年)是北宋的文坛领袖,很喜欢奖掖后进。其门下最有名的是“苏门四学士”,另外还有“苏门六学士”和“苏门后四学士”之说。 一、苏门四学士 苏轼在《与李昭玘书》中说: 轼蒙庇粗遣࿰…...
MD5算法:高效安全的数据完整性保障
摘要:在数字世界中,确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中,Message Digest Algorithm 5(MD5)算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…...
JavaScript基础五对象 内置对象 Math.random()
内置对象-生成任意范围随机数 Math.random() 随机数函数, 返回一个0 - 1之间,并且包括0不包括1的随机小数 [0, 1) 如何生成0-10的随机数呢? Math.floor(Math.random() * (10 1)) 放大11倍再向下取整 如何生成5-10的随机数&…...
curl之网络接口
Curl_cftype 连接接口定义 struct Curl_cftype {const char *name; /* name of the filter type */int flags; /* flags of filter type */int log_level; /* log level for such filters */Cu…...
Pytest中doctests的测试方法应用
在 Python 的测试生态中,Pytest 提供了多种灵活且强大的测试工具。其中,doctests 是一种独特而直观的测试方法,通过直接从文档注释中提取和执行测试用例,确保代码示例的正确性。本文将深入介绍 Pytest 中 doctests 的测试方法,包括基本用法和实际案例,以帮助你更好地利用…...
Android 8.1 铃声音量通话音量同步调节
Android 8.1 铃声音量通话音量同步调节 最近收到客户反馈,想要实现铃声音量通话音量同步调节,具体修改参照如下: /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…...
C++——字符串string
C——字符串string C语言中对字符串的表示通常用指针,新手会面临内存泄漏或者段错误等众多问题。 在 C 中, string 类是标准库的一部分,用于表示和操作字符串。它是对传统的 C 风格字符串(以空 字符 ‘\0’ 结尾的字符数组&…...
HBuilder使用[微信小程序开发者工具] 显示 × initialize报错
解决办法 我们先要单独打开 微信开发者工具 点击设置里面的安全,把服务器端口打开 然后再回到我们的HBuilder使用重新打开打开 成功打开...
洛谷P8599 [蓝桥杯 2013 省 B] 带分数
[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式: 100 3 69258 714 100 3 \frac{69258}{714} 100371469258。 还可以表示为: 100 82 3546 197 100 82 \frac{3546}{197} 100821973546。 注意特征:带分…...
grafana安装DevOpsProdigy KubeGraf 1.5.2
安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址:https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本: [rootmaster1 kube-state-metrics]# ll 总用量 …...
大数据 - Hadoop系列《三》- MapReduce(分布式计算引擎)概述
上一篇文章: 大数据 - Hadoop系列《三》- HDFS(分布式文件系统)概述-CSDN博客 目录 12.1 针对MapReduce的设计构思 1. 如何对付大数据处理场景 2. 构建抽象编程模型 3. 统一架构、隐藏底层细节 12.2 分布式计算概念 12.3 MapReduce定义…...
了解Ansible自动化运维工具及模块的使用
一、Ansible的相关知识 1.1 Ansible工具的了解 Ansible是一个基于Python开发的配置管理和应用部署工具,现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点,Pubbet和Saltstack能实现的功能,Ansible基本上都可以实现。Ansible…...
sql指南之null值用法
注明:参考文章: SQL避坑指南之NULL值知多少?_select null as-CSDN博客文章浏览阅读2.9k次,点赞7次,收藏21次。0 引言 SQL NULL(UNKNOW)是用来代表缺失值的术语,在表中的NULL值是显示…...
常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结
目录 前言 1、常见消息队列 1.ActiveMQ 2.RabbitMQ 3.RocketMQ 4.Kafka 2、区别 1.消息传递模型 2.消息持久化 3.消息顺序性 4.可靠性 5.生态系统和社区支持 6.表格对比 前言 消息队列可以实现应用程序之间的异步通信,能够实现异步消息的发送和接收&am…...
火柴人大逃亡
欢迎来到程序小院 火柴人大逃亡 玩法:左右两边火柴人,点击左边左边火柴人跳跃,点击右边右边跳跃, 上下快速移动道路,躲过障碍物,看你能坚持多久,快去火柴人大逃亡吧^^。开始游戏https://www.or…...
AI革命新篇章:法国天才团队挑战ChatGPT霸主地位
Mistral AI: Guillaume Lample, Arthur Mensch et Timothe Lacroix. ChatGPT 的霸主地位已被三位来自法国的天才所颠覆!如上图这三个人,其中一位曾在 DeepMind 工作,另外两位来自 Meta,他们联手为 AI 领域带来了革命性的变革 我…...
数据双向绑定v-modal
v-model v-model就实现了双向数据绑定,实际上它就是通过Vue提供的事件机制。即在子组件通过$emit()触发一个事件,在父组件使用v-on来监听对应的事件并修改相应的数据。 input的v-model就是通过<input :value"value" input"input"…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
