You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.4 KiB
Go

package app
import (
"context"
"fmt"
"github.com/panjf2000/ants/v2"
)
type AntsLog struct {
}
func (AntsLog) Printf(format string, args ...interface{}) {
Logger.Error(context.Background(), fmt.Sprintf(format, args...))
}
// 队列消费者池
var QueueConsumerPool, _ = ants.NewMultiPool(
50, // 50个池
60, // 每个池60个任务
ants.RoundRobin,
ants.WithPreAlloc(true),
ants.WithPanicHandler(func(i interface{}) {
Logger.Error(context.Background(), fmt.Sprintf("ants task panic: %v", i))
}),
ants.WithLogger(AntsLog{}),
)
func GoSafe(fn func(), msg ...any) {
go func() {
defer func() {
if re := recover(); re != nil {
//协程异常捕捉及重试
if len(msg) > 0 {
Logger.Error(context.Background(), fmt.Sprint(fmt.Sprint(msg...), fmt.Sprintf("协程捕捉到异常:%v", re)))
} else {
Logger.Error(context.Background(), fmt.Sprintf("协程捕捉到异常:%v", re))
}
}
}()
fn()
}()
}
func GoSafeRetry(fn func(), retryFn func(), msg ...any) {
go func() {
defer func() {
if re := recover(); re != nil {
//协程异常捕捉及重试
if len(msg) > 0 {
Logger.Error(context.Background(), fmt.Sprint(fmt.Sprint(msg...), fmt.Sprintf("协程捕捉到异常:%v", re)))
} else {
Logger.Error(context.Background(), fmt.Sprintf("协程捕捉到异常:%v", re))
}
retryFn()
}
}()
fn()
}()
}