
go-zero框架threading包—安全运行goroutine
发布日期:2021-05-14 20:12:11
浏览次数:18
分类:精选文章
本文共 1736 字,大约阅读时间需要 5 分钟。
Go-zero threading package
本文将首先介绍零阈值编程库中的两个核心方法:GoSafe
和 RunSafe
。
核心方法说明
1. GoSafe(使用协程运行方法)
GoSafe
是一个辅助函数,用于在新的 goroutine 中执行给定的函数。这是一个轻量级的协程运行机制,能够有效地利用 goroutine 并行执行。
函数定义:
func GoSafe(fn func()) { go RunSafe(fn)}
代码解析:
Gosafe
会启动一个新的 goroutine(使用go
keyword),执行RunSafe
函数。RunSafe
是一个更底层的函数,负责处理可能的 panics(panic Recover)。
2. RunSafe(带 panic 捕捉)
RunSafe
函数能够安全地执行给定的函数,并在函数发生 panic 时,通过 panic 捕捉机制进行处理。它配备了一个恢复机制,确保在错误发生时能够优雅地退出并做好必要的清理工作。
函数定义:
func RunSafe(fn func()) { defer rescue.Recover() fn()}
代码解析:
RunSafe
函数先执行一个defer rescue.Recover()
,这会在函数fn
执行过程中,发生 panic 的时候自动调用rescue
方法。- 如果函数
fn
完美运行,没有 panic,rescue
方法将不会被调用。 - 如果
fn
发生 panic,rescue
方法会被调用,执行图中的清理步骤(如日志记录、资源释放等)。 - 如果发生 panic 并且
rescue
失败恢复,函数会调用logx.ErrorStack(p)
,将错误信息记录到日志中。
运行步骤说明
1. 开启 goroutine 执行
使用 Gosafe
方法启动 goroutine 并执行目标函数。这种方式并不会阻塞当前 goroutine,能高效利用多核 CPU 执行任务。例如:
Gosafe(func() { // 放置执行目标函数的逻辑})
2. 增加 panic 捕捉
在使用 RunSafe
方法时,确保在函数中使用 defer rescue.Recover()
来捕捉可能的 panic。实现方式如下:
RunSafe(func() { // 放置需要保护的代码 defer rescue.Recover()})
3. 饱ough 恢复机制
rescue
方法通过 defer
关键字进行衔接,确保在函数 panics 时能自动调用恢复步骤。例如:
defer rescue.Recover()// 如果执行到这里出现 panic,下一步会调用 recovery 函数
代码示例
完整的实现代码如下:
package mainimport ( "context")func GoSafe(fn func() error) { go RunSafe(fn)}func RunSafe(fn func() error) { defer rescue.Recover() fn()}func RunSafeWithPanic(fn func() error) { if err := fn(); err != nil { return err } return nil}func RunSafeWithErrorWrapper(fn func() error) { // 其他的逻辑}func Rescue(out error) { if out != nil { // 记录错误日志 logx.ErrorStack(out) // 其他的恢复逻辑 }}
以上说明清楚地描述了 Gosafe
和 RunSafe
方法的使用方式,以及它们如何通过 goroutine 和 panic 捕捉机制实现零阈值编程的安全运行。
发表评论
最新留言
路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月15日 15时17分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【Linux】VMware Workstation 不可恢复错误: (vcpu-0)
2019-03-09
VS中 fatal error LNK1123: 转换到 COFF 期间失败 的解决方法
2019-03-09
ant design pro v5去掉右边content区域的水印
2019-03-09
JavaScript——使用iterator遍历迭代map,set集合元素
2019-03-09
IAR调试卡顿的解决办法
2019-03-10
Course Schedule II
2019-03-10
Django ORM操作
2019-03-10
京喜小程序体验评分优化实践
2019-03-10
C#中文转换成拼音
2019-03-10
C++错误笔记
2019-03-10
【无线通信模块】GPRS DTU不稳定和容易掉线原因
2019-03-10
SpringBoot使用RedisTemplate简单操作Redis的五种数据类型
2019-03-10
国标流媒体服务器以ROOT身份运行提示“permission denide”报错解决
2019-03-10
qt中转到槽后如何取消信号与槽关联
2019-03-10
qt问题记录-spin box与double spin box
2019-03-10
移动端事件
2019-03-10
css 图片按比例缩放
2019-03-10
小程序form表单里面buton点击事件失效
2019-03-10