- routine.callFun中应该要关闭chan
This commit is contained in:
@@ -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)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user