goProject/trunk/framework/goroutineMgr/goroutineCount.go

94 lines
1.8 KiB
Go
Raw Normal View History

2025-01-06 16:01:02 +08:00
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()
}