mirror of
https://github.com/duanhf2012/origin.git
synced 2026-05-19 07:37:29 +08:00
新增协程封装库
This commit is contained in:
43
util/Coroutine.go
Normal file
43
util/Coroutine.go
Normal file
@@ -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...)
|
||||||
|
}
|
||||||
@@ -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)
|
|
||||||
}
|
|
||||||
10
util/Log.go
Normal file
10
util/Log.go
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
package util
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
type PrintLog func(uint, string, ...interface{})
|
||||||
|
|
||||||
|
var Log PrintLog
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user