diff --git a/kernel/task/queue.go b/kernel/task/queue.go index b80f0081e..1ae5124b3 100644 --- a/kernel/task/queue.go +++ b/kernel/task/queue.go @@ -91,7 +91,7 @@ func containTask(task *Task, tasks []*Task) bool { } for i, arg := range t.Args { - if !reflect.DeepEqual(arg, task.Args[i]) { + if !areArgsEqual(arg, task.Args[i]) { return false } } @@ -101,6 +101,90 @@ func containTask(task *Task, tasks []*Task) bool { return false } +// areArgsEqual 比较两个参数是否相等 +func areArgsEqual(a, b interface{}) bool { + + // 如果两个参数都为 nil + if a == nil && b == nil { + return true + } + if a == nil || b == nil { + return false + } + + // 快速处理常见的基本类型 + switch av := a.(type) { + case string: + if bv, ok := b.(string); ok { + return av == bv + } + case int: + if bv, ok := b.(int); ok { + return av == bv + } + case int64: + if bv, ok := b.(int64); ok { + return av == bv + } + case int32: + if bv, ok := b.(int32); ok { + return av == bv + } + case bool: + if bv, ok := b.(bool); ok { + return av == bv + } + case float64: + if bv, ok := b.(float64); ok { + return av == bv + } + case float32: + if bv, ok := b.(float32); ok { + return av == bv + } + case uint: + if bv, ok := b.(uint); ok { + return av == bv + } + case uint64: + if bv, ok := b.(uint64); ok { + return av == bv + } + case uint32: + if bv, ok := b.(uint32); ok { + return av == bv + } + case []string: + if bv, ok := b.([]string); ok { + if len(av) != len(bv) { + return false + } + for i := range av { + if av[i] != bv[i] { + return false + } + } + return true + } + case []int: + if bv, ok := b.([]int); ok { + if len(av) != len(bv) { + return false + } + for i := range av { + if av[i] != bv[i] { + return false + } + } + return true + } + } + + // 未处理的复杂类型,回退到 reflect.DeepEqual + return reflect.DeepEqual(a, b) +} + + func getCurrentTasks() (ret []*Task) { queueLock.Lock() defer queueLock.Unlock()