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