65 lines
1.2 KiB
Go
65 lines
1.2 KiB
Go
package async
|
|
|
|
import (
|
|
"context"
|
|
"runtime/debug"
|
|
"sundynix-go/global"
|
|
"sync"
|
|
"time"
|
|
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
type AsyncTask func(ctx context.Context)
|
|
|
|
type namedTask struct {
|
|
name string
|
|
fn AsyncTask
|
|
}
|
|
|
|
type TaskRunner struct {
|
|
mu sync.Mutex
|
|
tasks []namedTask
|
|
}
|
|
|
|
// Add 添加任务
|
|
func (tr *TaskRunner) Add(name string, task AsyncTask) {
|
|
if task == nil {
|
|
return
|
|
}
|
|
tr.mu.Lock()
|
|
defer tr.mu.Unlock()
|
|
tr.tasks = append(tr.tasks, namedTask{name: name, fn: task})
|
|
}
|
|
|
|
// RunAll 安全执行
|
|
func (tr *TaskRunner) RunAll() {
|
|
tr.mu.Lock()
|
|
todoTasks := tr.tasks
|
|
tr.tasks = nil
|
|
tr.mu.Unlock()
|
|
|
|
for _, task := range todoTasks {
|
|
t := task
|
|
go func() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
// 使用全局 Zap 记录结构化日志
|
|
// 这里的 global.Logger 替换为你实际的全局变量名
|
|
global.Logger.Error("异步任务异常崩溃",
|
|
zap.String("task_name", t.name),
|
|
zap.Any("panic_info", r),
|
|
zap.String("stack", string(debug.Stack())),
|
|
)
|
|
}
|
|
}()
|
|
|
|
// 异步任务执行,设置独立的超时控制
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
t.fn(ctx)
|
|
}()
|
|
}
|
|
}
|