feat: 通用任务运行器
This commit is contained in:
@@ -0,0 +1,38 @@
|
|||||||
|
package async
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"sundynix-go/global"
|
||||||
|
|
||||||
|
"go.uber.org/zap"
|
||||||
|
)
|
||||||
|
|
||||||
|
// AsyncTask 定义了异步任务的函数原型
|
||||||
|
type AsyncTask func(ctx context.Context)
|
||||||
|
|
||||||
|
// TaskRunner 任务收集器
|
||||||
|
type TaskRunner struct {
|
||||||
|
tasks []AsyncTask
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add 添加一个任务到队列中
|
||||||
|
func (tr *TaskRunner) Add(task AsyncTask) {
|
||||||
|
tr.tasks = append(tr.tasks, task)
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunAll 安全地启动所有任务
|
||||||
|
func (tr *TaskRunner) RunAll() {
|
||||||
|
for _, task := range tr.tasks {
|
||||||
|
t := task // 避免闭包变量捕获问题
|
||||||
|
go func() {
|
||||||
|
defer func() {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
global.Logger.Info("[AsyncError] 任务执行崩溃", zap.Any("recover", r))
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
// 异步任务通常使用 Background,避免受主请求超时影响
|
||||||
|
// 也可以自定义一个更长的超时 context
|
||||||
|
t(context.Background())
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user