- routine.callFun中应该要关闭chan

This commit is contained in:
gazebo
2019-05-14 11:24:10 +08:00
parent 1807578974
commit 07bbbab8fc

View File

@@ -5,6 +5,8 @@ import (
"encoding/binary" "encoding/binary"
"fmt" "fmt"
"runtime/debug" "runtime/debug"
"git.rosy.net.cn/baseapi/utils"
) )
const ( const (
@@ -65,23 +67,27 @@ func taskFun(taskChan chan *TaskParam, index int) {
} }
} }
func (p *Pool) callFun(func4Call func(), primaryID string, isAsync bool) chan interface{} { func (p *Pool) callFun(func4Call func(), primaryID string, isAsync bool) (r interface{}) {
result := md5.Sum([]byte(primaryID)) result := md5.Sum([]byte(primaryID))
resultInt64 := int64(binary.LittleEndian.Uint32(result[8:])) resultInt64 := int64(binary.LittleEndian.Uint32(result[8:]))
chanIndex := int(resultInt64 % int64(p.curRoutineCount)) chanIndex := int(resultInt64 % int64(p.curRoutineCount))
chanParam := &TaskParam{ chanParam := &TaskParam{
handler: func4Call, handler: func4Call,
} }
if isAsync { if !isAsync {
chanParam.resultChan = make(chan interface{}) chanParam.resultChan = make(chan interface{})
} }
p.taskChans[chanIndex] <- chanParam p.taskChans[chanIndex] <- chanParam
return chanParam.resultChan if !isAsync {
r = <-chanParam.resultChan
close(chanParam.resultChan)
}
return r
} }
func (p *Pool) CallFun(func4Call func(), primaryID string) { func (p *Pool) CallFun(func4Call func(), primaryID string) {
if p.curRoutineCount > 0 { if p.curRoutineCount > 0 {
r := <-p.callFun(func4Call, primaryID, true) r := p.callFun(func4Call, primaryID, false)
if r != nil { if r != nil {
panic(r) panic(r)
} }
@@ -94,5 +100,7 @@ func (p *Pool) CallFunAsync(func4Call func(), primaryID string) {
if p.curRoutineCount == 0 { if p.curRoutineCount == 0 {
panic("CallFunAsync can not run when p.curRoutineCount == 0") panic("CallFunAsync can not run when p.curRoutineCount == 0")
} }
p.callFun(func4Call, primaryID, false) utils.CallFuncAsync(func() {
p.callFun(func4Call, primaryID, true)
})
} }