初始化项目

This commit is contained in:
皮蛋13361098506
2025-01-06 16:01:02 +08:00
commit 1b77f62820
575 changed files with 69193 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
package goroutineMgr
/*
goroutine的管理包提供了对goroutine的监控机制
对外提供的方法为:
// 监控指定的goroutine
Monitor(goroutineName string)
// 只添加数量,不监控
MonitorZero(goroutineName string)
// 释放监控
ReleaseMonitor(goroutineName string)
*/

View 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()
}

View 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
}