讀 "優雅關閉的 Go Web 伺服器"

stayfoo發表於2019-08-31
[讀 "優雅關閉的 Go Web 伺服器" ](https://github.com/stayfoo/stayfoo-hub/blob/master/docs/golang/read-article/1、read-優雅關閉的GoWeb伺服器.md) GitHub 倉庫:https://github.com/stayfoo/stayfoo-hub 文章《優雅的關閉 `Go Web` 伺服器》( [Go語言中文網](https://mp.weixin.qq.com/s/rA_oh472ZhfcAsAkWyyXFA) )寫到:可以通過開啟一個單獨的 `goroutine` 攔截關閉訊號,這樣,當伺服器真正關閉之前,可以做一些任務,做完任務再發出執行完畢的關閉號。 一些任務比如:清理某些資源;完成資料庫事務;一些其他長時間的操作;退出服務的那一刻,剛好收到一個響應,為了保證所有請求完成,就可以在這裡,在最大超時時間內去處理這個響應;dump程式當前狀態;記錄日誌的動作。 啟動應用,`Ctrl + C` 中斷程式,中斷訊號被攔截,do something..... ```bash go run main.go -listen-addr=5001 http: 2019/08/31 11:34:30 Server is ready to handle requests at :5001 ^Chttp: 2019/08/31 11:34:32 Server is shutting down... do something start ..... 2019-08-31 11:34:32.594668 +0800 CST m=+2.337451148 do something end ..... 2019-08-31 11:34:37.598248 +0800 CST m=+7.340881516 http: 2019/08/31 11:34:37 Server stopped ``` 對文中程式碼做了改造,程式碼如下: ```go var listenAddr string func init() { //接收埠號,預設埠號:5000 flag.StringVar(&listenAddr, "listen-addr", ":5000", "server listen address") } func main() { flag.Parse() //外部引數解析 listenAddr = fmt.Sprintf(":%s",listenAddr) logger := log.New(os.Stdout, "http: ", log.LstdFlags) //建立 server: server := newWebServer(logger) done := make(chan struct{}, 1) quit := make(chan os.Signal, 1) //os.Interrupt: syscall.SIGINT signal.Notify(quit, os.Interrupt) //啟動另一個 goroutine ,監聽將要關閉訊號: go shutdown(server, logger, quit, done) //啟動 server: logger.Println("Server is ready to handle requests at",listenAddr) err := server.ListenAndServe() if err != nil && err != http.ErrServerClosed { logger.Fatalf("Could not listen on %s: %v \n", listenAddr, err) } //等待已經關閉的訊號:

相關文章