From 738bf3d5b8822538d62c32650f3e0b1744e601ba Mon Sep 17 00:00:00 2001 From: boyce Date: Mon, 25 Mar 2019 11:53:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=8D=8F=E7=A8=8B=E5=B0=81?= =?UTF-8?q?=E8=A3=85=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- util/Coroutine.go | 43 +++++++++++++++++++++ util/CoroutinePool.go | 89 ------------------------------------------- util/Log.go | 10 +++++ 3 files changed, 53 insertions(+), 89 deletions(-) create mode 100644 util/Coroutine.go delete mode 100644 util/CoroutinePool.go create mode 100644 util/Log.go 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 + + +