go-zero框架threading包—安全运行goroutine
发布日期:2021-05-14 20:12:11 浏览次数:18 分类:精选文章

本文共 1736 字,大约阅读时间需要 5 分钟。

Go-zero threading package

本文将首先介绍零阈值编程库中的两个核心方法:GoSafeRunSafe

核心方法说明

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 main
import (
"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)
// 其他的恢复逻辑
}
}

以上说明清楚地描述了 GosafeRunSafe 方法的使用方式,以及它们如何通过 goroutine 和 panic 捕捉机制实现零阈值编程的安全运行。

上一篇:第五课 golang的流程控制
下一篇:golang 第四课 结构体(struct)、interface{}、方法(func)详解

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2025年04月15日 15时17分52秒