go 优雅关闭

67 阅读1分钟

⽅法⼀:借助第三⽅的Go包

如果使⽤第三⽅的Go包来实现优雅关闭,⽬前⽤得⽐较多的包是fvbock/endless github.com/fvbock/endl…

⽅法⼆:编码实现


package server

import (
   "os"
   "os/signal"
)

var onlyOneSignalHandler = make(chan struct{})

var shutdownHandler chan os.Signal

// SetupSignalHandler registered for SIGTERM and SIGINT. A stop channel is returned
// which is closed on one of these signals. If a second signal is caught, the program
// is terminated with exit code 1.
func SetupSignalHandler() <-chan struct{} {
   close(onlyOneSignalHandler) // panics when called twice

   shutdownHandler = make(chan os.Signal, 2)

   stop := make(chan struct{})

   signal.Notify(shutdownHandler, shutdownSignals...)

   go func() {
      <-shutdownHandler
      close(stop)
      <-shutdownHandler
      os.Exit(1) // second signal. Exit directly.
   }()

   return stop
}

// RequestShutdown emulates a received event that is considered as shutdown signal (SIGTERM/SIGINT)
// This returns whether a handler was notified.
func RequestShutdown() bool {
   if shutdownHandler != nil {
      select {
      case shutdownHandler <- shutdownSignals[0]:
         return true
      default:
      }
   }

   return false
}

完整代码: golearn001: 学习go语言,程序优雅关闭 (gitee.com)