diff --git a/g/container/gtype/gtype_test.go b/g/container/gtype/gtype_test.go index 5cf65366c..1e79d19ee 100644 --- a/g/container/gtype/gtype_test.go +++ b/g/container/gtype/gtype_test.go @@ -12,6 +12,7 @@ import ( "testing" "strconv" "gitee.com/johng/gf/g/encoding/gbinary" + "sync/atomic" ) var it = NewInt() @@ -25,6 +26,8 @@ var bytes = NewBytes() var str = NewString() var inf = NewInterface() +var at = atomic.Value{} + func BenchmarkInt_Set(b *testing.B) { for i := 0; i < b.N; i++ { it.Set(i) @@ -193,3 +196,16 @@ func BenchmarkInterface_Val(b *testing.B) { } } + +func BenchmarkAtomicString_Store(b *testing.B) { + for i := 0; i < b.N; i++ { + at.Store(i) + } +} + +func BenchmarkAtomicString_Load(b *testing.B) { + for i := 0; i < b.N; i++ { + at.Load() + } +} + diff --git a/g/net/ghttp/ghttp_server_admin.go b/g/net/ghttp/ghttp_server_admin.go index ac44e95df..449f0b6e1 100644 --- a/g/net/ghttp/ghttp_server_admin.go +++ b/g/net/ghttp/ghttp_server_admin.go @@ -118,7 +118,7 @@ func (s *Server) Restart(newExeFilePath...string) error { if err := s.checkActionFrequence(); err != nil { return err } - return restartWebServers(false, newExeFilePath...) + return restartWebServers("", newExeFilePath...) } // 关闭Web Server @@ -131,7 +131,7 @@ func (s *Server) Shutdown() error { if err := s.checkActionFrequence(); err != nil { return err } - shutdownWebServers(false) + shutdownWebServers("") return nil } @@ -240,10 +240,10 @@ func bufferToServerFdMap(buffer []byte) map[string]listenerFdMap { } // Web Server重启 -func restartWebServers(isSignal bool, newExeFilePath...string) error { +func restartWebServers(signal string, newExeFilePath...string) error { serverProcessStatus.Set(gADMIN_ACTION_RESTARTING) if runtime.GOOS == "windows" { - if isSignal { + if len(signal) > 0 { // 在终端信号下,立即执行重启操作 forcedlyCloseWebServers() forkRestartProcess(newExeFilePath...) @@ -260,21 +260,27 @@ func restartWebServers(isSignal bool, newExeFilePath...string) error { serverProcessStatus.Set(gADMIN_ACTION_NONE) return err } else { - glog.Printfln("%d: server restarting", gproc.Pid()) + if len(signal) > 0 { + glog.Printfln("%d: server restarting by signal: %s", gproc.Pid(), signal) + } else { + glog.Printfln("%d: server restarting by web admin", gproc.Pid()) + } + } } return nil } // Web Server关闭服务 -func shutdownWebServers(isSignal bool) { +func shutdownWebServers(signal string) { serverProcessStatus.Set(gADMIN_ACTION_SHUTINGDOWN) - glog.Printfln("%d: server shutting down", gproc.Pid()) - if isSignal { + if len(signal) > 0 { + glog.Printfln("%d: server shutting down by signal: %s", gproc.Pid(), signal) // 在终端信号下,立即执行关闭操作 forcedlyCloseWebServers() doneChan <- struct{}{} } else { + glog.Printfln("%d: server shutting down by web admin", gproc.Pid()) // 非终端信号下,异步1秒后再执行关闭,目的是让接口能够正确返回结果,否则接口会报错(因为web server关闭了) gtime.SetTimeout(time.Second, func() { forcedlyCloseWebServers() diff --git a/g/net/ghttp/ghttp_server_admin_unix.go b/g/net/ghttp/ghttp_server_admin_unix.go index 187e04a7d..96fc28049 100644 --- a/g/net/ghttp/ghttp_server_admin_unix.go +++ b/g/net/ghttp/ghttp_server_admin_unix.go @@ -35,12 +35,12 @@ func handleProcessSignal() { switch sig { // 进程终止,停止所有子进程运行 case syscall.SIGINT, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGHUP, syscall.SIGTERM: - shutdownWebServers(true) + shutdownWebServers(sig.String()) return // 用户信号,重启服务 case syscall.SIGUSR1: - restartWebServers(true) + restartWebServers(sig.String()) return default: diff --git a/geg/net/ghttp/server/reload/admin.go b/geg/net/ghttp/server/reload/admin.go index 7d6ed6f0d..a6dd2ecdf 100644 --- a/geg/net/ghttp/server/reload/admin.go +++ b/geg/net/ghttp/server/reload/admin.go @@ -6,7 +6,7 @@ import ( func main() { s := g.Server() - s.EnableAdmin("/admin") + s.EnableAdmin() //s.BindHookHandler("/admin/*any", ghttp.HOOK_BEFORE_SERVE, func(r *ghttp.Request) { // if !r.BasicAuth("admin", "123", "") { // r.Exit()