diff --git a/util/Coroutine.go b/util/Coroutine.go new file mode 100644 index 0000000..c70ead1 --- /dev/null +++ b/util/Coroutine.go @@ -0,0 +1,43 @@ +package util + +import ( + "fmt" + "reflect" + "runtime/debug" +) + +func F(callback interface{}, args ...interface{}) { + defer func() { + if r := recover(); r != nil { + var coreInfo string + str, ok := r.(string) + if ok { + coreInfo = string(debug.Stack()) + } else { + coreInfo = "Panic!" + } + + coreInfo += "\n" + fmt.Sprintf("core information is %s\n", str) + if Log != nil { + Log(5, coreInfo) + } else { + fmt.Print(coreInfo) + } + } + }() + + v := reflect.ValueOf(callback) + if v.Kind() != reflect.Func { + panic("not a function") + } + vargs := make([]reflect.Value, len(args)) + for i, arg := range args { + vargs[i] = reflect.ValueOf(arg) + } + + v.Call(vargs) +} + +func Go(callback interface{}, args ...interface{}) { + go F(callback, args...) +} diff --git a/util/CoroutinePool.go b/util/CoroutinePool.go deleted file mode 100644 index b14c795..0000000 --- a/util/CoroutinePool.go +++ /dev/null @@ -1,89 +0,0 @@ -package util - -import ( - "fmt" - "reflect" - "sync/atomic" -) - -type CoroutineFun func() -type Task struct { - fun *reflect.Value - vargs []reflect.Value -} - -var _taskChannel chan Task -var _totalConroutineNum int32 //当前空闲协程数 -var _currConroutineNum int32 //当前申请的协程数 -var _maxConroutineNum int32 //最大允许协程数 - -func F(callback interface{}, args ...interface{}) { - v := reflect.ValueOf(callback) - if v.Kind() != reflect.Func { - panic("not a function") - } - vargs := make([]reflect.Value, len(args)) - for i, arg := range args { - vargs[i] = reflect.ValueOf(arg) - } - - vrets := v.Call(vargs) - - fmt.Print("\tReturn values: ", vrets) -} - -func newConroutine() { - go func() { - fmt.Print("+") - atomic.AddInt32(&_currConroutineNum, 1) - for { - atomic.AddInt32(&_totalConroutineNum, 1) - task := <-_taskChannel - fmt.Print(".") - atomic.AddInt32(&_totalConroutineNum, -1) - task.fun.Call(task.vargs) - - if atomic.LoadInt32(&_currConroutineNum) > _maxConroutineNum { - atomic.AddInt32(&_currConroutineNum, -1) - break - } - } - }() -} - -func InitConroutinePool(initConroutineNum int32, maxConroutineNum int32) { - _maxConroutineNum = maxConroutineNum - var i int32 - for ; i < initConroutineNum; i++ { - newConroutine() - } - - _taskChannel = make(chan Task, 10240) -} - -func Go(callback interface{}, args ...interface{}) { - v := reflect.ValueOf(callback) - if v.Kind() != reflect.Func { - panic("not a function") - } - - vargs := make([]reflect.Value, len(args)) - for i, arg := range args { - vargs[i] = reflect.ValueOf(arg) - } - - //当前协程数不足增加 - if atomic.LoadInt32(&_totalConroutineNum) <= 0 { - newConroutine() - } - - _taskChannel <- Task{&v, vargs} -} - -func DebugInfo() { - fmt.Printf("_taskChannel:%d,_totalConroutineNum:%d,_currConroutineNum:%d,_maxConroutineNum:%d\n", len(_taskChannel), _totalConroutineNum, _currConroutineNum, _maxConroutineNum) -} - -func GetChanelCount() int { - return len(_taskChannel) -} diff --git a/util/Log.go b/util/Log.go new file mode 100644 index 0000000..197d55d --- /dev/null +++ b/util/Log.go @@ -0,0 +1,10 @@ +package util + + + +type PrintLog func(uint, string, ...interface{}) + +var Log PrintLog + + +