日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Go的优雅终止姿势

發布時間:2024/1/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Go的优雅终止姿势 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python微信訂餐小程序課程視頻

https://edu.csdn.net/course/detail/36074

Python實戰量化交易理財系統

https://edu.csdn.net/course/detail/35475
最近優化了一版程序:用到了golang的優雅退出機制。

程序使用etcd的election sdk做高可用選主,需要在節點意外下線的時候,主動去etcd卸任(刪除10s租約), 否則已經下線的節點還會被etcd認為是leader。

所以在這里,優雅退出是技術剛需。

另外根據[云原生十二要素方法論] 第9條: 快速啟動和優雅終止可最大化健壯性 , 也推薦各位遵守實踐。
Fast startup and shutdown are advocated for a more robust and resilient system.


粗淺的認知方案: 捕獲程序的終止信號, 主動去卸任。

標準信號
Linux支持如下標準信號,第二列指示該信號遵守的標準。

Signal Standard Action Comment────────────────────────────────────────────────────────────────────────SIGABRT P1990 Core Abort signal from abort(3)SIGALRM P1990 Term Timer signal from alarm(2)SIGBUS P2001 Core Bus error (bad memory access)SIGCHLD P1990 Ign Child stopped or terminatedSIGCLD - Ign A synonym for SIGCHLDSIGCONT P1990 Cont Continue if stoppedSIGEMT - Term Emulator trapSIGFPE P1990 Core Floating-point exceptionSIGHUP P1990 Term Hangup detected on controlling terminalor death of controlling processSIGILL P1990 Core Illegal InstructionSIGINFO - A synonym for SIGPWRSIGINT P1990 Term Interrupt from keyboardSIGIO - Term I/O now possible (4.2BSD)SIGIOT - Core IOT trap. A synonym for SIGABRTSIGKILL P1990 Term Kill signalSIGLOST - Term File lock lost (unused)SIGPIPE P1990 Term Broken pipe: write to pipe with noreaders; see pipe(7)SIGPOLL P2001 Term Pollable event (Sys V);synonym for SIGIOSIGPROF P2001 Term Profiling timer expiredSIGPWR - Term Power failure (System V)SIGQUIT P1990 Core Quit from keyboardSIGSEGV P1990 Core Invalid memory referenceSIGSTKFLT - Term Stack fault on coprocessor (unused)SIGSTOP P1990 Stop Stop processSIGTSTP P1990 Stop Stop typed at terminalSIGSYS P2001 Core Bad system call (SVr4);see also seccomp(2)SIGTERM P1990 Term Termination signalSIGTRAP P2001 Core Trace/breakpoint trapSIGTTIN P1990 Stop Terminal input for background processSIGTTOU P1990 Stop Terminal output for background processSIGUNUSED - Core Synonymous with SIGSYSSIGURG P2001 Ign Urgent condition on socket (4.2BSD)SIGUSR1 P1990 Term User-defined signal 1SIGUSR2 P1990 Term User-defined signal 2SIGVTALRM P2001 Term Virtual alarm clock (4.2BSD)SIGXCPU P2001 Core CPU time limit exceeded (4.2BSD);see setrlimit(2)SIGXFSZ P2001 Core File size limit exceeded (4.2BSD);see setrlimit(2)SIGWINCH - Ign Window resize signal (4.3BSD, Sun)

其中SIGKILL,SIGSTOP信號不能被捕獲,阻塞,忽略。

我們常見的三種終止程序的操作:

  • CTRL+C 實際是發送SIGINT信號,
  • kill pid的作用是向指定進程發送SIGTERM信號(這是kill默認發送的信息), 若應用程序沒有捕獲并響應該信號的邏輯,則該信號默認動作是kill掉進程,這是終止進程的推薦做法。
  • kill -9 pid 則是向指定進程發送SIGKILL信號,SIGKILL信號既不能被應用程序捕獲,也不能被阻塞或忽略,
  • 故要達成我們的目的,這里捕獲 SIGINT SIGTREM信號就可滿足需求。


    golang提供signal包來監聽并反饋收到的信號。

    可針對長時間運行的程序,新開協程,持續監聽信號,并插入優雅關閉的代碼。

    c := make(chan os.Signal) signal.Notify(c, syscall.SIGTERM, syscall.SIGINT) go func() {select {case sig:= <-c: {log.Infof("Got %s signal. Aborting...\n", sig)eCli.Close() // 利用 etcd election sdk主動卸任os.Exit(1) }}}()

    是不是依舊適配容器?

    我們得看DOCKER官方docker stop,docker kill命令的定義。

    docker stop: The main process inside the container will receiver SIGTREM, and after a grace period,SIGKILL .(default grace period =10s)

    docker kill:The main process inside the container is sent SIGKILL signal (default), or the signal that is specified with the --signal option

    我們常用的docker stop命令: 向容器內進程發送SIGTREM信號,10s后發送SIGKILL信號,這10s時間給了程序做優雅關閉的時機,所以上面代碼的邏輯是能適配容器的。

    總結

    以上是生活随笔為你收集整理的Go的优雅终止姿势的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。