当前位置: 首页 > news >正文

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的退出 本文简要介绍了&#xff0c;如何用channel控制goroutine的退出的基本方法 for-range主动停止goruitine package mainimport ("fmt""sync""time" )/* Go并发编程模型&#xff1a;主动停止goroutine 方法一&#…...

强大的虚拟机Parallels Desktop 19 mac中文激活

Parallels Desktop是一款功能全面、易于使用的虚拟机软件&#xff0c;它为用户提供了在Mac电脑上同时运行多个操作系统的便利。 软件下载&#xff1a;Parallels Desktop 19 mac中文激活版下载 Parallels Desktop 19 mac具有快速启动和关闭虚拟机的能力&#xff0c;让用户能够迅…...

单元测试框架深入(一):单元测试框架深入

一、一个简单的例子 1、引入Maven依赖&#xff1a;JUnit框架和Surefire插件 2.在src/test/java目录下新建名字以“Test”结尾的测试类&#xff0c;并用Test注释测试方法 3.运行单元测试用例 或用mvn命令运行单元测试&#xff1a; 二、单元测试基础之单元测试框架&#xff1a;J…...

苏门X学士常识学习

前言 苏轼&#xff08;1037年—1101年&#xff09;是北宋的文坛领袖&#xff0c;很喜欢奖掖后进。其门下最有名的是“苏门四学士”&#xff0c;另外还有“苏门六学士”和“苏门后四学士”之说。 一、苏门四学士 苏轼在《与李昭玘书》中说&#xff1a; 轼蒙庇粗遣&#xff0…...

MD5算法:高效安全的数据完整性保障

摘要&#xff1a;在数字世界中&#xff0c;确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中&#xff0c;Message Digest Algorithm 5&#xff08;MD5&#xff09;算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点…...

JavaScript基础五对象 内置对象 Math.random()

内置对象-生成任意范围随机数 Math.random() 随机数函数&#xff0c; 返回一个0 - 1之间&#xff0c;并且包括0不包括1的随机小数 [0, 1&#xff09; 如何生成0-10的随机数呢&#xff1f; 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 铃声音量通话音量同步调节 最近收到客户反馈&#xff0c;想要实现铃声音量通话音量同步调节&#xff0c;具体修改参照如下&#xff1a; /frameworks/base/core/java/android/preference/SeekBarVolumizer.java if (defaultUri null) {if (mStreamType AudioMan…...

C++——字符串string

C——字符串string C语言中对字符串的表示通常用指针&#xff0c;新手会面临内存泄漏或者段错误等众多问题。 在 C 中&#xff0c; string 类是标准库的一部分&#xff0c;用于表示和操作字符串。它是对传统的 C 风格字符串&#xff08;以空 字符 ‘\0’ 结尾的字符数组&…...

HBuilder使用[微信小程序开发者工具] 显示 × initialize报错

解决办法 我们先要单独打开 微信开发者工具 点击设置里面的安全,把服务器端口打开 然后再回到我们的HBuilder使用重新打开打开 成功打开...

洛谷P8599 [蓝桥杯 2013 省 B] 带分数

[蓝桥杯 2013 省 B] 带分数 题目描述 100 100 100 可以表示为带分数的形式&#xff1a; 100 3 69258 714 100 3 \frac{69258}{714} 100371469258​。 还可以表示为&#xff1a; 100 82 3546 197 100 82 \frac{3546}{197} 100821973546​。 注意特征&#xff1a;带分…...

grafana安装DevOpsProdigy KubeGraf 1.5.2

安装DevOpsProdigy KubeGraf需要安装kube-state-metrics 官方地址&#xff1a;https://github.com/kubernetes/kube-state-metrics/tree/release-2.10/examples/standard 查看k8s版本和kube-state-metrics对应版本&#xff1a; [rootmaster1 kube-state-metrics]# ll 总用量 …...

大数据 - Hadoop系列《三》- MapReduce(分布式计算引擎)概述

上一篇文章&#xff1a; 大数据 - Hadoop系列《三》- HDFS&#xff08;分布式文件系统&#xff09;概述-CSDN博客 目录 12.1 针对MapReduce的设计构思 1. 如何对付大数据处理场景 2. 构建抽象编程模型 3. 统一架构、隐藏底层细节 12.2 分布式计算概念 12.3 MapReduce定义…...

了解Ansible自动化运维工具及模块的使用

一、Ansible的相关知识 1.1 Ansible工具的了解 Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。Ansible…...

sql指南之null值用法

注明&#xff1a;参考文章&#xff1a; SQL避坑指南之NULL值知多少&#xff1f;_select null as-CSDN博客文章浏览阅读2.9k次&#xff0c;点赞7次&#xff0c;收藏21次。0 引言 SQL NULL&#xff08;UNKNOW&#xff09;是用来代表缺失值的术语&#xff0c;在表中的NULL值是显示…...

常见消息队列:ActiveMQ、RabbitMQ、RocketMQ、Kafka的区别总结

目录 前言 1、常见消息队列 1.ActiveMQ 2.RabbitMQ 3.RocketMQ 4.Kafka 2、区别 1.消息传递模型 2.消息持久化 3.消息顺序性 4.可靠性 5.生态系统和社区支持 6.表格对比 前言 消息队列可以实现应用程序之间的异步通信&#xff0c;能够实现异步消息的发送和接收&am…...

火柴人大逃亡

欢迎来到程序小院 火柴人大逃亡 玩法&#xff1a;左右两边火柴人&#xff0c;点击左边左边火柴人跳跃&#xff0c;点击右边右边跳跃&#xff0c; 上下快速移动道路&#xff0c;躲过障碍物&#xff0c;看你能坚持多久&#xff0c;快去火柴人大逃亡吧^^。开始游戏https://www.or…...

AI革命新篇章:法国天才团队挑战ChatGPT霸主地位

Mistral AI: Guillaume Lample, Arthur Mensch et Timothe Lacroix. ChatGPT 的霸主地位已被三位来自法国的天才所颠覆&#xff01;如上图这三个人&#xff0c;其中一位曾在 DeepMind 工作&#xff0c;另外两位来自 Meta&#xff0c;他们联手为 AI 领域带来了革命性的变革 我…...

数据双向绑定v-modal

v-model v-model就实现了双向数据绑定&#xff0c;实际上它就是通过Vue提供的事件机制。即在子组件通过$emit()触发一个事件&#xff0c;在父组件使用v-on来监听对应的事件并修改相应的数据。 input的v-model就是通过<input :value"value" input"input"…...

在自动化视频剪辑脚本中调用AI进行智能片段筛选与拼接

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 在自动化视频剪辑脚本中调用AI进行智能片段筛选与拼接 自动化视频生产正成为内容创作者和运营团队提升效率的关键路径。面对海量的…...

Legacy iOS Kit:让旧iPhone重获新生的终极指南

Legacy iOS Kit&#xff1a;让旧iPhone重获新生的终极指南 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to restore/downgrade, save SHSH blobs, jailbreak legacy iOS devices, and more 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit 你是否有…...

Hitboxer:游戏键位重映射终极解决方案,告别操作冲突困扰

Hitboxer&#xff1a;游戏键位重映射终极解决方案&#xff0c;告别操作冲突困扰 【免费下载链接】socd Key remapper for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 你是否曾在激烈的游戏对战中&#xff0c;因为同时按下相反方向键而导致操作混乱&…...

利用AI与间隔重复技术,在Obsidian中自动化生成学习闪卡

1. 项目概述与核心价值如果你和我一样&#xff0c;是个重度 Obsidian 用户&#xff0c;同时又对间隔重复记忆法&#xff08;Spaced Repetition&#xff09;情有独钟&#xff0c;那你肯定遇到过这个痛点&#xff1a;把笔记整理成闪卡&#xff08;Flashcards&#xff09;的过程&a…...

从ROS到飞控:ENU与NED坐标系转换的实战解析与避坑指南

1. 为什么ENU和NED坐标系让开发者头疼&#xff1f; 第一次接触无人机开发时&#xff0c;我被ROS和飞控之间的坐标系问题坑得不轻。明明在ROS里跑得好好的导航算法&#xff0c;一接入PX4飞控就出现飞机往反方向飞、高度控制错乱的情况。后来才发现&#xff0c;这全是ENU和NED坐标…...

STM32F103 Flash读写避坑大全:从解锁失败到数据丢失,我踩过的坑你别再踩

STM32F103 Flash读写避坑大全&#xff1a;从解锁失败到数据丢失&#xff0c;我踩过的坑你别再踩 第一次在STM32F103上操作内部Flash时&#xff0c;我以为按照手册步骤就能轻松完成。直到调试灯疯狂闪烁、数据神秘消失、芯片莫名锁死&#xff0c;才意识到这片存储区域远没有想象…...

观察Taotoken用量看板如何帮助个人开发者精打细算

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken用量看板如何帮助个人开发者精打细算 对于独立开发者和小型项目团队而言&#xff0c;在探索和应用大模型时&#xff0…...

别再只用Excel画图了!用GraphPad Prism处理‘性别+药物’双因素实验数据的完整攻略

GraphPad Prism双因素实验数据分析&#xff1a;从数据整理到科学图表 在生物医学研究中&#xff0c;双因素实验设计(如性别药物处理)能帮助我们探索变量间的交互作用&#xff0c;但这类数据的可视化常常让研究者头疼——如何在有限图表空间中清晰呈现多重比较结果&#xff1f;传…...

英雄联盟段位修改终极指南:5分钟掌握LeaguePrank伪装技巧

英雄联盟段位修改终极指南&#xff1a;5分钟掌握LeaguePrank伪装技巧 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank 你是否想过在英雄联盟中展示不同的段位给好友看&#xff1f;LeaguePrank正是为你量身打造的段位修改神器&a…...

如何彻底告别杂乱书签:终极Chrome树状书签管理工具完整指南

如何彻底告别杂乱书签&#xff1a;终极Chrome树状书签管理工具完整指南 【免费下载链接】neat-bookmarks A neat bookmarks tree popup extension for Chrome [DISCONTINUED] 项目地址: https://gitcode.com/gh_mirrors/ne/neat-bookmarks 还在为浏览器书签堆积如山而烦…...