Go优雅退出进程

Posted 泰 戈 尔

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Go优雅退出进程相关的知识,希望对你有一定的参考价值。

优雅退出进程:即在进程正常退出之前,可以执行一些自定义的清理回收等类型的工作。

常规版

package main

import (
   "os"
   "os/signal"
   "syscall"
   "fmt"
)
// 生产者: 生成 factor 整数倍的序列
func Producer(factor int, out chan<- int) 
   for i := 0; ; i++ 
      out <- i*factor
   


// 消费者
func Consumer(in <-chan int) 
   for v := range in 
      fmt.Println(v)
   

func main() 
   ch := make(chan int, 64) // 成果队列

   go Producer(3, ch) // 生成 3 的倍数的序列
   go Producer(5, ch) // 生成 5 的倍数的序列
   go Consumer(ch)    // 消费 生成的队列

   // Ctrl+C 退出
   sig := make(chan os.Signal, 1)
   signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
   fmt.Printf("quit (%v)\\n", <-sig)

关键部分代码

gracefullyShutdown := make(chan bool)
sig := make(chan os.Signal, 1)
signal.Notify(sig, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("listening for request...")
<- gracefullyShutdown
fmt.Println("Gracefully shutdown server!")

web 版

package main

import (
   "fmt"
   "net/http"
   "os"
   "os/signal"
   "syscall"
   "time"
)

func run(writer http.ResponseWriter, request *http.Request) 
   writer.Write([]byte("hello"))


func Run() 
   mux := http.NewServeMux()
   mux.HandleFunc("/run", run)

   server := &http.Server
      Addr: "127.0.0.1",
      WriteTimeout: time.Second * 3,
      Handler: mux,
   

   go server.ListenAndServe()

   quit := make(chan os.Signal, 0)
   signal.Notify(quit, syscall.SIGKILL, syscall.SIGQUIT, syscall.SIGINT, syscall.SIGTERM)
   <-quit
   fmt.Println("bye-bye")


func main() 

   Run()

以上是关于Go优雅退出进程的主要内容,如果未能解决你的问题,请参考以下文章

Go的优雅终止姿势

如何在 Go 中优雅关闭子进程

如何在 Go 中优雅关闭子进程

优雅的退出/关闭/重启gunicorn进程

在python中捕获Ctrl + C / SIGINT并优雅地退出多进程[重复]

linux 优雅的退出/关闭/重启gunicorn进程