Python 流程可以不間斷地優雅地處理 SIGTERM 嗎?

Barbara Streisand
發布: 2024-11-10 19:23:02
原創
629 人瀏覽過

Can Python Processes Handle SIGTERM Gracefully Without Interruption?

處理SIGTERM 以實現正常關機

在實際應用程式中,確保進程能夠正常處理終止訊號至關重要以防止突然中斷。在 Python 中,處理 SIGTERM (TERM) 是管理守護程式時的常見要求。

考慮以下範例守護程式:

def mainloop():
    while True:
        # Important operations
        # ...
        # Sleep
登入後複製

問題:

Daemon 程式預設收到SIGTERM 訊號時,執行流程會立即中斷,導致進程在沒有完成正在進行的操作的情況下終止。

問題:

是否可以在不中斷當前執行流程的情況下優雅地處理SIGTERM?目標是讓進程完成當前操作,然後透過在單獨的執行緒中設定關閉標誌來正常退出。

解決方案:

使用Graceful Killer 類別:

我們可以利用一個簡單的GracefulKiller 類來優雅地處理SIGTERM:

import signal
import time

class GracefulKiller:
    kill_now = False

    def __init__(self):
        signal.signal(signal.SIGINT, self.exit_gracefully)
        signal.signal(signal.SIGTERM, self.exit_gracefully)

    def exit_gracefully(self, signum, frame):
        self.kill_now = True

if __name__ == '__main__':
    killer = GracefulKiller()
    while not killer.kill_now:
        time.sleep(1)
        print("Performing operation...")

    print("Process exited gracefully.")
登入後複製

在此解決方案中:

  1. The GracefulKiller類別設定SIGINT (Ctrl C) 和SIGTERM(預設由start-stop-daemon 發送)的訊號處理程式.
  2. 當收到任一訊號時,都會執行 exit_graceously 方法。它將kill_now標誌設定為True。
  3. 主循環不斷檢查kill_now標誌。如果為 True,則表示已收到訊號,進程正常退出。
  4. 這種方法允許主循環在進程退出之前完成當前操作,防止進程突然終止。

以上是Python 流程可以不間斷地優雅地處理 SIGTERM 嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板