Go 优雅处理goroutines错误

在Go语言中,goroutines是轻量级的线程,它们在后台运行,可以并发执行任务。优雅地处理goroutines中的错误是确保程序稳定性和可维护性的关键。

使用Channel返回错误

Go中goroutines通常通过channel来通信。你可以创建一个额外的channel来发送错误信息。

案例一:

goroutines 中的通道理解为一种可以发射或接收信号的传感器。然后,我会将错误视为信号。当传感器收到信号(错误)时,它会通知我们已经收到信号,然后我们就可以利用这些信号启动进一步的流程。

package mainimport ("errors""fmt""time"
)func main() {errCh := make(chan error, 3)go errorSpawning(3*time.Second, errCh)go errorSpawning(2*time.Second, errCh)go errorSpawning(4*time.Second, errCh)for err := range errCh {if err != nil {panic(err)}}
}func errorSpawning(delay time.Duration, errCh chan<- error) {time.Sleep(delay) //模拟业务处理时间fmt.Printf("业务运行%v后出现错误\n", delay)errCh <- errors.New("处理业务出错")
}

只需声明 errCh(错误通道),通道大小等于需要处理的 goroutines 数量。在本例中,errCh 的大小为 3。

然后将 errCh 作为 chan<- error 传递到函数中(该符号表示 errCh 在该函数中只是一个接收器)。再用一个 for 循环来捕捉错误信号,循环的 channel 为 errCh。

使用这种写法,如果有一个 goroutines 遇到错误,main() 函数就会崩溃。无需等待所有 goroutines 全部结束。

案例二:

package mainimport ("errors""fmt""time"
)func main() {errCh := make(chan error, 3)go errorSpawning(3*time.Second, errCh)go errorSpawning(2*time.Second, errCh)go errorSpawning(4*time.Second, errCh)for {select {case e := <-errCh:if e != nil {fmt.Println(e)}case <-time.After(time.Second * 5):return}}
}func errorSpawning(delay time.Duration, errCh chan<- error) {defer func() {if r := recover(); r != nil {//...}}()time.Sleep(delay) //模拟业务处理时间err := errors.New("处理" + delay.String() + "的业务出错")errCh <- errif err != nil {panic(err)}
}

 一个goroutine错误不影响其他的goroutine 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/23817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Questflow借助MongoDB Atlas以AI重新定义未来工作方式

MongoDB客户案例导读 Questflow借助MongoDB Atlas赋能AI员工&#xff0c;助力中小型初创企业自动化工作流程&#xff0c;简化数据分析&#xff0c;提升客户体验&#xff0c;推动AI与员工的协作&#xff0c;重新定义未来工作方式。 协作式AI自动化平台 无需编码即可拥有自己的…

动态规划(多重背包问题+二进制优化)

引言 多重背包&#xff0c;相对于01背包来说&#xff0c;多重背包是每个物品会有相应的个数&#xff0c;最多可以选那么多个&#xff0c;因而对于朴素多重背包&#xff0c;需要在01背包的基础上&#xff0c;再加一层物品的循环 朴素多重背包例题 P2347 [NOIP1996 提高组] 砝…

【因果推断python】19_局部平均效应2

目录 局部平均干预效果&#xff1a;后期 对参与度的影响 关键思想 局部平均干预效果&#xff1a;后期 局部平均处理效应明确了我们可以估计因果效应的人群。这也是查看 IV 的另一种方式&#xff0c;它提供了我们可以使用的其他很酷的直觉。在现代 IV 中&#xff0c;我们将工…

Codeforces Round 951 (Div. 2) C、D(构造、线段树)

1979C - Earning on Bets 构造题&#xff1a;观察到k范围很小&#xff0c;首先考虑最终硬币总数可以是多少&#xff0c;我们可以先假设最终的硬币总数为所有k取值的最小公倍数&#xff0c;这样只需要满足每个结果添加1枚硬币即可赚到硬币。 // Problem: C. Earning on Bets //…

《Kubernetes部署篇:基于Kylin V10+ARM64架构CPU+containerd一键离线部署容器版K8S1.26.15高可用集群》

总结&#xff1a;整理不易&#xff0c;如果对你有帮助&#xff0c;可否点赞关注一下&#xff1f; 更多详细内容请参考&#xff1a;企业级K8s集群运维实战 一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署基于containerd容器版 K8S 1.26.15集群&…

备份和恢复realme智能手机:综合指南

realme自2018年成立至今&#xff0c;一直秉持着“敢于超越”的品牌精神&#xff0c;专注于为全球年轻用户提供性能卓越、设计新颖的高品质手机。对于如何备份和恢复realme手机&#xff0c;本文将介绍多种不同的方法。 第1部分&#xff1a;使用Coolmuster Android Backup Mana…

用 OpenCV 实现图像中水平线检测与校正

前言 在本文中&#xff0c;我们将探讨如何使用 Python 和 OpenCV 库来检测图像中的水平线&#xff0c;并对图像进行旋转校正以使这些线条水平。这种技术可广泛应用于文档扫描、建筑摄影校正以及机器视觉中的各种场景。 环境准备 首先&#xff0c;确保您的环境中安装了 OpenC…

【RAG提升技巧】查询改写HyDE

简介 提高 RAG 推理能力的一个好方法是添加查询理解层 ——在实际查询向量存储之前添加查询转换。以下是四种不同的查询转换&#xff1a; 路由&#xff1a;保留初始查询&#xff0c;同时查明其所属的适当工具子集。然后&#xff0c;将这些工具指定为合适的选项。查询重写&…

随身WIFI修改MAC(bssid)并接收短信

将SIM卡插入随身WiFi卡槽 将随身WIFI插入电脑 打开 http://ufi.icewifi.com &#xff0c;输入设备IMEI &#xff08;或直接扫描设备包装盒上的二维码&#xff09; 点击“确认” 登录到设备主页&#xff08;网址可收藏保存&#xff09; 点击“WIFI配置”按钮&#xff0c;输入想…

C#——枚举类型详情

枚举类型 枚举类型&#xff08;也可以称为“枚举器”&#xff09;由一组具有独立标识符&#xff08;名称&#xff09;的整数类型常量构成&#xff0c;在 C# 中枚举类型不仅可以在类或结构体的内部声明&#xff0c;也可以在类或结构体的外部声明&#xff0c;默认情况下枚举类型…

【Python报错】已解决AttributeError: Nonetype Object Has NoAttribute Group

解决Python报错&#xff1a;AttributeError: ‘list’ object has no attribute ‘get’ 在Python中&#xff0c;AttributeError通常表示你试图访问的对象没有你请求的属性或方法。如果你遇到了AttributeError: list object has no attribute get的错误&#xff0c;这通常意味着…

引发焦虑的一些问题,以及应对焦虑的一些思考

昨晚和一好友约了饭&#xff0c;喝酒聊天&#xff0c; 感觉的出&#xff0c;他的状态不太好&#xff0c; 对工作、对生活&#xff0c;有股子焦虑感和无力感&#xff0c; 聊下来&#xff0c;主要是有下面几个问题&#xff1a; 1、觉得当前的生活不太稳定&#xff0c;在上海一直…

【NoSQL数据库】Redis——哨兵模式

Redis——哨兵模式 Redis哨兵 Redis——哨兵模式1.什么是哨兵机制&#xff08;Redis Sentinel&#xff09;1.1 哨兵的作用 2.哨兵的运行机制3.故障处理redis常见问题汇总1、redis缓存击穿是什么&#xff1f;如何解决&#xff1f;2、redis缓存穿透是什么&#xff1f;如何解决&am…

如何查询公网IP?

在互联网中&#xff0c;每个设备都有一个唯一的公网IP地址&#xff0c;用于标识设备在全球范围内的位置。查询公网IP是一个常见的需求&#xff0c;无论是用于远程访问、网络配置还是其他目的&#xff0c;了解自己的公网IP地址都是很有必要的。本文将介绍几种常见的方法来查询公…

HQChart使用教程100-自定义Y轴分段背景色

HQChart使用教程100-自定义Y轴分段背景色 效果图步骤1. 注册Y轴自定义刻度创建事件2. 配置Y轴背景色eventdataobj示例 交流QQ群HQChart代码地址 效果图 步骤 1. 注册Y轴自定义刻度创建事件 事件IDSCHART_EVENT_ID.ON_CREATE_CUSTOM_Y_COORDINATE, 如何注册事件详见教程 HQCh…

代码审计(1):CVE-2022-4957分析及复现

0x00漏洞描述&#xff1a; ѕрееdtеѕt iѕ а vеrу liɡhtԝеiɡ&#xff48;t nеtԝоrk ѕрееd tеѕtinɡ tооl imрlеmеntеd in Jаvаѕсriрt. Thеrе iѕ а Crоѕѕ-ѕitе Sсriрtinɡ vulnеrаbilitу in librеѕроndеd ѕрееdtеѕt…

[word] word2019中制表符的妙用 #媒体#笔记#知识分享

word2019中制表符的妙用 word2019表格功能是非常强大的&#xff0c;很多朋友都认为以前的制表符已经没有什么用途了&#xff0c;其实不然&#xff0c;在一切特殊的场合&#xff0c;word2019制表符还是非常有用的&#xff0c;下面就为大家介绍word2019中制表符的妙用。 步骤1、…

每日复盘-20240606

今日关注&#xff1a; 这几天市场环境不好&#xff0c;一直空仓。 排名标准: ------沪深A股 排名--------代码--------- 名称 六日涨幅最大: ------1--------301176--------- 逸豪新材 五日涨幅最大: ------1--------301176--------- 逸豪新材 四日涨幅最大: ------1--------…

MySQL-6、单表访问方法

前言 前面介绍了MySQL表空间相关的内容。包括区、段、碎片区&#xff0c;还有一些不同的页类型的作用。 &#xff08;如果没有看前面五篇文章&#xff0c;不建议看此篇文章&#xff09; 传送门&#xff1a; MySQL-1、InnoDB行格式 MySQL-2、InnoDB数据页 MySQL-3、索引 M…

信息系统项目管理师0146:输入(9项目范围管理—9.3规划范围管理—9.3.1输入)

点击查看专栏目录 文章目录 9.3 规划范围管理9.3.1 输入9.3 规划范围管理 规划范围管理是为了记录如何定义、确认和控制项目范围及产品范围,而创建范围管理计划的过程。本过程的主要作用是在整个项目期间对如何管理范围提供指南和方向。本过程仅开展一次或仅在项目的预定义点开…