golang學習筆記 優雅的退出golang服務

2021-09-24 03:08:10 字數 1560 閱讀 4494

寫了一段時間的golang後台,怎麼優雅的退出程式一直是乙個很模糊的問題。思路還是之前的思路,各種標誌和變數來回控制,雖然說是能夠滿足需求,但是總感覺那開啟的姿勢不對,下面對優雅的退出golang做乙個小總結,廢話不多說,直接上**。

主程式**。模擬乙個服務物件,函式reloadclose分別是過載和退出,通過列印顯示呼叫。

type service struct

func

new(

)*service

func

(s *service)

close()

error

func

(s *service)

reload()

error

// handlerexit handler exit signal

func

handlerexit

(exitfn func

(s os.signal)

int)

// handlerreload handler reload signal

func

handlerreload

(reload func

(s os.signal))}()}

srv :=

new(

)logger.

printf

("++++已經啟動++++"

)utils.

handlerreload

(func

(s os.signal)})

utils.

handlerexit

(func

(s os.signal)

int logger.

printf

(" service exit"

)return0}

)

以上就已經實現了通過檢測訊號使go程式正常退出。需要指出的是這裡的正常退出只是最一開始的部分,程式內部的邏輯需要使用到別的都一些知識點來協作,完成go程式的正常退出。在golang學習筆記-優雅的退出golang服務2詳細說明。

程式編譯啟動後,查到程序的pid,向程序傳送signup訊號,程式收到這個訊號後,執行reload函式,列印重啟的日誌。退出時傳送kill或者quit訊號都可以檢測到,結果如下:

不同平台的訊號定義或許有些不同。下面列出了posix中定義的訊號。

linux 使用34-64訊號用作實時系統中。

命令 man signal 提供了官方的訊號介紹。

在posix.1-1990標準中定義的訊號列表

golang學習筆記 優雅的退出golang服務2

前不久介紹了如何比較 優雅的退出golang服務 雖然能夠優雅的退出,但是只是簡單的監聽了系統的訊號,後續服務模組得到資源釋放又牽扯到更多的邏輯。對於服務啟動的子協程的宣告週期顯然沒有考慮到。經過一些時間的實踐和閱讀大佬們的 對如何優雅的退出golang服務再做乙個簡單的記錄。乙個供外部呼叫的釋放資...

Golang的優雅重啟

更新 2015年4月 florian von bock 已將本文中描述的內容轉換為乙個名為 endless 的優秀go包 如果您有golang http服務,可能需要重新啟動它以公升級二進位制檔案或更改某些配置。如果你 像我一樣 因為網路伺服器處理它而優雅地重新啟動是理所當然的,你可能會發現這個配方...

如何優雅的入門golang

golang標準庫文件 高效能分布式系統開發 海量並行處理 遊戲服務端開發再好不過了 package main import fmt func main 複製 go run main.go hello world 複製 識別符號用來命名變數 型別等程式體。乙個或者多個字母 a za z 數字 0 9...