Files
huangguo_server/common/go.go
T
rootandClaude Opus 5 8679200f41 Initial commit
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-15 13:57:10 +08:00

109 lines
2.4 KiB
Go

package common
import (
"fmt"
"runtime/debug"
"sync"
"sync/atomic"
"time"
"91porn-server/common/log"
"91porn-server/common/stderr"
)
var (
routinePanicHandler func(string)
routineCount int64
)
func SetPanicHandler(handler func(string)) {
routinePanicHandler = handler
}
func Go(f func()) {
atomic.AddInt64(&routineCount, 1)
go func() {
defer func() {
atomic.AddInt64(&routineCount, -1)
if r := recover(); r != nil {
log.Error("【Warning】serevr occour error,please attention", log.Any("Detail", r))
if routinePanicHandler != nil {
var stack string
if !stderr.IsContain(r, stderr.WriteBrokenError) {
stack = string(debug.Stack())
}
routinePanicHandler(fmt.Sprintf("[Panic] routineCount:%d \n err: %+v\n", routineCount, r) + stack)
}
}
}()
f()
}()
}
func GoParam(i int, f func(i int)) {
atomic.AddInt64(&routineCount, 1)
go func(i int) {
defer func() {
atomic.AddInt64(&routineCount, -1)
if r := recover(); r != nil {
log.Error("【Warning】serevr occour error,please attention", log.Any("Detail", r))
if routinePanicHandler != nil {
var stack string
if !stderr.IsContain(r, stderr.WriteBrokenError) {
stack = string(debug.Stack())
}
routinePanicHandler(fmt.Sprintf("[Panic] routineCount:%d \n err: %+v\n", routineCount, r) + stack)
}
}
}()
f(i)
}(i)
}
// WaitGoQuit 等待go退出,timeoutSec 超时秒数,<=0表示不超时
func WaitGoQuit(timeoutSec int32) {
for {
count := atomic.LoadInt64(&routineCount)
if count == 0 {
return
}
time.Sleep(time.Second)
if timeoutSec > 0 {
timeoutSec--
if timeoutSec == 0 {
return
}
}
}
}
func GoAndWait(funcs ...func() error) (err error) {
var wg sync.WaitGroup
wg.Add(len(funcs))
for i := range funcs {
go func(f func() error) {
atomic.AddInt64(&routineCount, 1)
defer wg.Done()
defer func() {
atomic.AddInt64(&routineCount, -1)
if r := recover(); r != nil {
log.Error("【Warning】serevr occour error,please attention", log.Any("Detail", r))
if routinePanicHandler != nil {
var stack string
if !stderr.IsContain(r, stderr.WriteBrokenError) {
stack = string(debug.Stack())
}
routinePanicHandler(fmt.Sprintf("[Panic] routineCount:%d \n err: %+v\n", routineCount, r) + stack)
}
}
}()
if routineErr := f(); routineErr != nil {
err = routineErr
}
}(funcs[i])
}
wg.Wait()
return
}