优化添加的逻辑

This commit is contained in:
yun
2025-10-13 19:01:45 +08:00
parent 1b9e9b757b
commit 382bc7b21b
2 changed files with 29 additions and 8 deletions
+3 -3
View File
@@ -30,7 +30,7 @@ func main() {
ch := make(chan ChanStatus, 1000) ch := make(chan ChanStatus, 1000)
go func() { go func() {
for a := 0; a < 100; a++ { for a := 0; a < 10; a++ {
go func(a int) { go func(a int) {
for status := range ch { for status := range ch {
// fmt.Println("协程", a, "处理任务", status) // fmt.Println("协程", a, "处理任务", status)
@@ -47,9 +47,9 @@ func main() {
go func() { go func() {
// 一千万任务,每个任务间隔1秒 // 一千万任务,每个任务间隔1秒
for i := 0; i < 100; i++ { for i := 0; i < 10; i++ {
runTime := t.Add(time.Duration(i) * time.Second) runTime := t.Add(time.Duration(i) * time.Second)
for j := 0; j < 100; j++ { for j := 0; j < 10; j++ {
ch <- ChanStatus{ ch <- ChanStatus{
I: i, I: i,
J: j, J: j,
+26 -5
View File
@@ -88,6 +88,13 @@ const (
jobTypeList = "list" jobTypeList = "list"
) )
type createSource string
const (
createSourceDefault = "default"
createSourceRetry = "retry"
)
// 初始化 // 初始化
func InitOnce(ctx context.Context, re redis.UniversalClient, keyPrefix string, call Callback, opts ...Option) (*Once, error) { func InitOnce(ctx context.Context, re redis.UniversalClient, keyPrefix string, call Callback, opts ...Option) (*Once, error) {
op := newOptions(opts...) op := newOptions(opts...)
@@ -411,20 +418,20 @@ func (l *Once) Create(ctx context.Context, taskType OnceTaskType, taskId string,
return ErrDelayTime return ErrDelayTime
} }
execTime := time.Now().Add(delayTime) execTime := time.Now().Add(delayTime)
return l.create(ctx, jobTypeOnce, taskType, taskId, []time.Time{execTime}, attachData, 0) return l.create(ctx, createSourceDefault, jobTypeOnce, taskType, taskId, []time.Time{execTime}, attachData, 0)
} }
// 指定时间执行(不覆盖) // 指定时间执行(不覆盖)
func (l *Once) CreateByTime(ctx context.Context, taskType OnceTaskType, taskId string, executeTime time.Time, attachData any) error { func (l *Once) CreateByTime(ctx context.Context, taskType OnceTaskType, taskId string, executeTime time.Time, attachData any) error {
return l.create(ctx, jobTypeOnce, taskType, taskId, []time.Time{executeTime}, attachData, 0) return l.create(ctx, createSourceDefault, jobTypeOnce, taskType, taskId, []time.Time{executeTime}, attachData, 0)
} }
// 指定多个时间执行(不覆盖) // 指定多个时间执行(不覆盖)
func (l *Once) CreateByList(ctx context.Context, taskType OnceTaskType, taskId string, taskTimes []time.Time, attachData any) error { func (l *Once) CreateByList(ctx context.Context, taskType OnceTaskType, taskId string, taskTimes []time.Time, attachData any) error {
return l.create(ctx, jobTypeList, taskType, taskId, taskTimes, attachData, 0) return l.create(ctx, createSourceDefault, jobTypeList, taskType, taskId, taskTimes, attachData, 0)
} }
func (l *Once) create(ctx context.Context, jobType jobType, taskType OnceTaskType, taskId string, taskTimes []time.Time, attachData any, runCount int) error { func (l *Once) create(ctx context.Context, source createSource, jobType jobType, taskType OnceTaskType, taskId string, taskTimes []time.Time, attachData any, runCount int) error {
if len(taskTimes) <= 0 { if len(taskTimes) <= 0 {
l.logger.Errorf(ctx, "delay time must be positive taskType:%v taskId:%v attachData:%v runCount:%v", taskType, taskId, attachData, runCount) l.logger.Errorf(ctx, "delay time must be positive taskType:%v taskId:%v attachData:%v runCount:%v", taskType, taskId, attachData, runCount)
return ErrExecuteTime return ErrExecuteTime
@@ -432,6 +439,20 @@ func (l *Once) create(ctx context.Context, jobType jobType, taskType OnceTaskTyp
redisKey := l.buildRedisKey(taskType, taskId) redisKey := l.buildRedisKey(taskType, taskId)
if source != createSourceRetry {
// 这里加一个全局锁 从Retry来的不需要 因为已经加锁了
lock, err := lockx.NewGlobalLock(ctx, l.redis, l.globalLockPrefix+redisKey)
if err != nil {
l.logger.Errorf(ctx, "processTask timer:获取锁失败:%s", taskId)
return err
}
if b, err := lock.Lock(); !b {
l.logger.Errorf(ctx, "processTask timer:获取锁失败:%s %+v", taskId, err)
return err
}
defer lock.Unlock()
}
score, err := l.redis.ZScore(l.ctx, l.zsetKey, redisKey).Result() score, err := l.redis.ZScore(l.ctx, l.zsetKey, redisKey).Result()
if err != nil { if err != nil {
if errors.Is(err, redis.Nil) { if errors.Is(err, redis.Nil) {
@@ -596,5 +617,5 @@ func (l *Once) handleRetry(ctx context.Context, taskType OnceTaskType, taskId st
taskType, taskId, ed.RunCount) taskType, taskId, ed.RunCount)
// 不覆盖的新建 // 不覆盖的新建
return l.create(ctx, ed.JobType, taskType, taskId, ed.TaskTimes, ed.Data, ed.RunCount) return l.create(ctx, createSourceRetry, ed.JobType, taskType, taskId, ed.TaskTimes, ed.Data, ed.RunCount)
} }