mirror of
https://github.com/duanhf2012/origin.git
synced 2026-02-04 06:54:45 +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