ホームページ  >  記事  >  バックエンド開発  >  Python プロセスは SIGTERM を中断せずに正常に処理できますか?

Python プロセスは SIGTERM を中断せずに正常に処理できますか?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-10 19:23:02633ブラウズ

Can Python Processes Handle SIGTERM Gracefully Without Interruption?

正常なシャットダウンのための SIGTERM の処理

実際のアプリケーションのコンテキストでは、プロセスが終了信号を正常に処理できることを確認することが重要です突然の中断を防ぐため。 Python では、SIGTERM (TERM) の処理は、デーモン プロセスを管理する際の一般的な要件です。

次のデーモン プロセスの例を考えてみましょう:

def mainloop():
    while True:
        # Important operations
        # ...
        # Sleep

問題:

デーモン プロセスがデフォルトで 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_gracefly メソッドが実行されます。 kill_now フラグを True に設定します。
  3. メイン ループは継続的に kill_now フラグをチェックします。 True の場合、シグナルが受信されたことを示し、プロセスは正常に終了します。
  4. このアプローチにより、プロセスが終了する前にメイン ループが現在の操作を完了できるようになり、突然の終了が防止されます。

以上がPython プロセスは SIGTERM を中断せずに正常に処理できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。