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优雅退出进程的主要内容,如果未能解决你的问题,请参考以下文章