From 1a2f6535619cdad8f2e69456528f7798ce21f8ab Mon Sep 17 00:00:00 2001 From: gazebo Date: Fri, 17 Jan 2020 22:16:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E4=BB=BB=E5=8A=A1=E5=A4=A7=E9=87=8F=E5=87=BA=E9=94=99?= =?UTF-8?q?=E5=90=8E=E5=AF=BC=E8=87=B4=E5=86=85=E5=AD=98=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E5=BE=88=E5=A4=A7=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- business/jxutils/tasksch/parallel_task.go | 1 - business/jxutils/tasksch/sequence_task.go | 1 - business/jxutils/tasksch/task.go | 42 +++++++++++++++++------ 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/business/jxutils/tasksch/parallel_task.go b/business/jxutils/tasksch/parallel_task.go index 50b30da1b..f99361328 100644 --- a/business/jxutils/tasksch/parallel_task.go +++ b/business/jxutils/tasksch/parallel_task.go @@ -186,6 +186,5 @@ func (task *ParallelTask) Run() { } func (t *ParallelTask) AddChild(task ITask) ITask { - task.SetParent(t) return t.BaseTask.AddChild(task) } diff --git a/business/jxutils/tasksch/sequence_task.go b/business/jxutils/tasksch/sequence_task.go index 1ab500466..bd25d425c 100644 --- a/business/jxutils/tasksch/sequence_task.go +++ b/business/jxutils/tasksch/sequence_task.go @@ -69,6 +69,5 @@ func (task *SeqTask) Run() { } func (t *SeqTask) AddChild(task ITask) ITask { - task.SetParent(t) return t.BaseTask.AddChild(task) } diff --git a/business/jxutils/tasksch/task.go b/business/jxutils/tasksch/task.go index b992f1981..89f407e4a 100644 --- a/business/jxutils/tasksch/task.go +++ b/business/jxutils/tasksch/task.go @@ -63,6 +63,7 @@ type ITask interface { // GetDetailErrList() []error GetLeafResult() (finishedItemCount, failedItemCount int) AddBatchErr(err error) + AddFailedList(failedList ...interface{}) GetFailedList() (failedList []interface{}) SetFinishHook(func(task ITask)) @@ -247,6 +248,8 @@ func (t *BaseTask) GetStatus() int { } func (t *BaseTask) AddChild(task ITask) ITask { + task.SetParent(t) + t.locker.Lock() defer t.locker.Unlock() @@ -368,22 +371,41 @@ func (t *BaseTask) SetFinishHook(hook func(task ITask)) { t.finishHook = hook } +// 此函数非线程安全,只能在确定任务结束后调用 func (t *BaseTask) GetFailedList() (failedList []interface{}) { - t.locker.RLock() - failedList = append(failedList, t.FailedList...) - t.locker.RUnlock() + // t.locker.RLock() + // failedList = append(failedList, t.FailedList...) + // t.locker.RUnlock() - for _, v := range t.Children { - failedList = append(failedList, v.GetFailedList()...) - } - return failedList + // for _, v := range t.Children { + // failedList = append(failedList, v.GetFailedList()...) + // } + // return failedList + + // t.locker.RLock() + // defer t.locker.RUnlock() + // if len(t.FailedList) > 0 { + // failedList = make([]interface{}, len(t.FailedList)) + // copy(failedList, t.FailedList) + // } + // return failedList + + return t.FailedList } func (t *BaseTask) AddFailedList(failedList ...interface{}) { if len(failedList) > 0 { - t.locker.Lock() - defer t.locker.Unlock() - t.FailedList = append(t.FailedList, failedList...) + // t.locker.Lock() + // defer t.locker.Unlock() + // t.FailedList = append(t.FailedList, failedList...) + + if t.parent == nil || t.finishHook != nil { + t.locker.Lock() + defer t.locker.Unlock() + t.FailedList = append(t.FailedList, failedList...) + } else { + t.parent.AddFailedList(failedList...) + } } }