初始化项目
This commit is contained in:
16
trunk/framework/goroutineMgr/doc.go
Normal file
16
trunk/framework/goroutineMgr/doc.go
Normal file
@@ -0,0 +1,16 @@
|
||||
package goroutineMgr
|
||||
|
||||
/*
|
||||
goroutine的管理包,提供了对goroutine的监控机制
|
||||
对外提供的方法为:
|
||||
|
||||
// 监控指定的goroutine
|
||||
Monitor(goroutineName string)
|
||||
|
||||
// 只添加数量,不监控
|
||||
MonitorZero(goroutineName string)
|
||||
|
||||
// 释放监控
|
||||
ReleaseMonitor(goroutineName string)
|
||||
|
||||
*/
|
||||
93
trunk/framework/goroutineMgr/goroutineCount.go
Normal file
93
trunk/framework/goroutineMgr/goroutineCount.go
Normal file
@@ -0,0 +1,93 @@
|
||||
package goroutineMgr
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"sort"
|
||||
"sync"
|
||||
|
||||
"goutil/logUtil"
|
||||
)
|
||||
|
||||
var (
|
||||
goroutineCountMap = make(map[string]int)
|
||||
goroutineCountMutex sync.RWMutex
|
||||
)
|
||||
|
||||
// 增加指定名称的goroutine的数量
|
||||
// goroutineName:goroutine名称
|
||||
func increaseCount(goroutineName string) {
|
||||
goroutineCountMutex.Lock()
|
||||
defer goroutineCountMutex.Unlock()
|
||||
|
||||
newCount := 1
|
||||
if currCount, exist := goroutineCountMap[goroutineName]; exist {
|
||||
newCount = currCount + 1
|
||||
}
|
||||
|
||||
goroutineCountMap[goroutineName] = newCount
|
||||
}
|
||||
|
||||
// 减少指定名称的goroutine的数量
|
||||
// goroutineName:goroutine名称
|
||||
func decreaseCount(goroutineName string) {
|
||||
goroutineCountMutex.Lock()
|
||||
defer goroutineCountMutex.Unlock()
|
||||
|
||||
newCount := -1
|
||||
if currCount, exist := goroutineCountMap[goroutineName]; exist {
|
||||
newCount = currCount - 1
|
||||
}
|
||||
|
||||
if newCount <= 0 {
|
||||
delete(goroutineCountMap, goroutineName)
|
||||
} else {
|
||||
goroutineCountMap[goroutineName] = newCount
|
||||
}
|
||||
}
|
||||
|
||||
// 获取指定名称的goroutine的数量
|
||||
// goroutineName:goroutine名称
|
||||
// 返回值:
|
||||
// 对应数量
|
||||
func getGoroutineCount(goroutineName string) int {
|
||||
goroutineCountMutex.RLock()
|
||||
defer goroutineCountMutex.RUnlock()
|
||||
|
||||
if currCount, exist := goroutineCountMap[goroutineName]; exist {
|
||||
return currCount
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
// 转化成字符串
|
||||
func toString() string {
|
||||
goroutineCountMutex.RLock()
|
||||
defer goroutineCountMutex.RUnlock()
|
||||
|
||||
keys := make([]string, 0, 16)
|
||||
for key := range goroutineCountMap {
|
||||
keys = append(keys, key)
|
||||
}
|
||||
|
||||
sort.Slice(keys, func(i, j int) bool {
|
||||
return keys[i] < keys[j]
|
||||
})
|
||||
|
||||
str := fmt.Sprintf("Goroutine Info:(%s,%d)", "NumGoroutine", runtime.NumGoroutine())
|
||||
for _, key := range keys {
|
||||
str += fmt.Sprintf("(%s,%d)", key, goroutineCountMap[key])
|
||||
}
|
||||
|
||||
return str
|
||||
}
|
||||
|
||||
// 记录goroutine数量信息
|
||||
func logGoroutineCountInfo() {
|
||||
logUtil.DebugLog(toString())
|
||||
}
|
||||
|
||||
func Test() {
|
||||
logGoroutineCountInfo()
|
||||
}
|
||||
75
trunk/framework/goroutineMgr/goroutineInfo.go
Normal file
75
trunk/framework/goroutineMgr/goroutineInfo.go
Normal file
@@ -0,0 +1,75 @@
|
||||
package goroutineMgr
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"runtime"
|
||||
"sync"
|
||||
|
||||
"framework/monitorNewMgr"
|
||||
"goutil/logUtil"
|
||||
)
|
||||
|
||||
var (
|
||||
goroutineInfoMap map[string]int = make(map[string]int)
|
||||
goroutineInfoMutex sync.RWMutex
|
||||
goroutineWarnCount int = 50
|
||||
)
|
||||
|
||||
func init() {
|
||||
monitorNewMgr.RegisterMonitorFunc(monitor)
|
||||
}
|
||||
|
||||
// 设置系统协程上报阈值
|
||||
func SetGoroutineWarnCount(warnCount int) {
|
||||
goroutineWarnCount = warnCount
|
||||
}
|
||||
|
||||
func registerGoroutineInfo(goroutineName string, count int) {
|
||||
goroutineInfoMutex.Lock()
|
||||
defer goroutineInfoMutex.Unlock()
|
||||
|
||||
goroutineInfoMap[goroutineName] = count
|
||||
}
|
||||
|
||||
// 监控指定的goroutine
|
||||
func Monitor(goroutineName string) {
|
||||
increaseCount(goroutineName)
|
||||
registerGoroutineInfo(goroutineName, 1)
|
||||
}
|
||||
|
||||
// 只添加数量,不监控
|
||||
func MonitorZero(goroutineName string) {
|
||||
increaseCount(goroutineName)
|
||||
}
|
||||
|
||||
// 释放监控
|
||||
func ReleaseMonitor(goroutineName string) {
|
||||
if r := recover(); r != nil {
|
||||
logUtil.LogUnknownError(r)
|
||||
}
|
||||
|
||||
decreaseCount(goroutineName)
|
||||
}
|
||||
|
||||
func monitor() error {
|
||||
// 判断当前goroutine数量是否达到打印条件(数量查过设置的值就打印)
|
||||
if goroutineWarnCount >= runtime.NumGoroutine() {
|
||||
return nil
|
||||
}
|
||||
/*
|
||||
先记录活跃的goroutine的数量信息
|
||||
然后再判断数量是否匹配
|
||||
*/
|
||||
logGoroutineCountInfo()
|
||||
|
||||
goroutineInfoMutex.RLock()
|
||||
defer goroutineInfoMutex.RUnlock()
|
||||
|
||||
for goroutineName, expectedCount := range goroutineInfoMap {
|
||||
if currCount := getGoroutineCount(goroutineName); currCount != expectedCount {
|
||||
return fmt.Errorf("%s需要%d个goroutine,现在有%d个", goroutineName, expectedCount, currCount)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user