From 413c9def9dd091207444ad44ba698a351906b34c Mon Sep 17 00:00:00 2001 From: gazebo Date: Sat, 21 Jul 2018 12:52:46 +0800 Subject: [PATCH] - refacor routinePoll CallFunc. --- utils/routinepool/routinepool.go | 37 ++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/utils/routinepool/routinepool.go b/utils/routinepool/routinepool.go index a15eb76e..17115757 100644 --- a/utils/routinepool/routinepool.go +++ b/utils/routinepool/routinepool.go @@ -58,22 +58,30 @@ func taskFun(taskChan chan *TaskParam, index int) { for { taskParam := <-taskChan // baseapi.SugarLogger.Debugf("routine:%d, handle task:%v", index, taskParam.handler) - taskParam.resultChan <- callHandler(taskParam.handler) + result := callHandler(taskParam.handler) + if taskParam.resultChan != nil { + taskParam.resultChan <- result + } } } +func (p *Pool) callFun(func4Call func(), primaryID string, isAsync bool) chan interface{} { + result := md5.Sum([]byte(primaryID)) + resultInt64 := int64(binary.LittleEndian.Uint32(result[8:])) + chanIndex := int(resultInt64 % int64(p.curRoutineCount)) + chanParam := &TaskParam{ + handler: func4Call, + } + if isAsync { + chanParam.resultChan = make(chan interface{}) + } + p.taskChans[chanIndex] <- chanParam + return chanParam.resultChan +} + func (p *Pool) CallFun(func4Call func(), primaryID string) { if p.curRoutineCount > 0 { - result := md5.Sum([]byte(primaryID)) - resultInt64 := int64(binary.LittleEndian.Uint32(result[8:])) - chanIndex := int(resultInt64 % int64(p.curRoutineCount)) - - chanParam := &TaskParam{ - handler: func4Call, - resultChan: make(chan interface{}), - } - p.taskChans[chanIndex] <- chanParam - r := <-chanParam.resultChan + r := <-p.callFun(func4Call, primaryID, true) if r != nil { panic(r) } @@ -81,3 +89,10 @@ func (p *Pool) CallFun(func4Call func(), primaryID string) { func4Call() } } + +func (p *Pool) CallFunAsync(func4Call func(), primaryID string) { + if p.curRoutineCount == 0 { + panic("CallFunAsync can not run when p.curRoutineCount == 0") + } + p.callFun(func4Call, primaryID, false) +}