ホームページ  >  記事  >  バックエンド開発  >  Python で SIGTERM シグナルを適切に処理する方法

Python で SIGTERM シグナルを適切に処理する方法

DDD
DDDオリジナル
2024-11-15 11:02:02173ブラウズ

How to Gracefully Handle SIGTERM Signals in Python?

Python で SIGTERM シグナルを適切に処理する

長時間実行される Python デーモンを使用する場合、SIGTERM などの終了シグナルを適切に処理することは、データ損失のないクリーンなシャットダウン。これには、現在の実行を一時停止し、必要なクリーンアップ タスクを実行して、プロセスを正常に終了する機能が含まれます。これを実現する方法は次のとおりです。

シグナル ハンドラーの使用

Python には、特定のシグナルのハンドラーを登録する signal.signal 関数が用意されています。 SIGTERM のハンドラーを登録すると、実行が終了する前にシグナルをインターセプトできます。ただし、質問で述べたように、ハンドラーは依然として現在の実行を中断し、制御をそれ自体に渡します。

シグナル処理に別のスレッドを使用します

現在の実行では、シグナル イベントを処理する別のスレッドを作成できます。これにより、メイン ループを中断することなく、シャットダウン関連のタスクをバックグラウンドで実行できるようになります。単純なクラスを使用した例を次に示します。

解決策:

import signal
import threading
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

def mainloop():
    killer = GracefulKiller()
    while not killer.kill_now:
        # Perform necessary tasks in the main loop
        time.sleep(1)
        print("doing something in a loop ...")

if __name__ == '__main__':
    mainloop()

    # When the main loop exits, we have gracefully handled the termination signal
    print("End of the program. I was killed gracefully :)")

このソリューションでは、GracefulKiller クラスが SIGTERM のシグナル ハンドラーを登録します。シグナルが受信されると、kill_now フラグが True に設定されます。メインループはこのフラグをチェックし、それが True になるまで継続します。これにより、メイン ループは正常に終了する前に重要なタスクを完了できます。

別のスレッドまたはクラスベースのソリューションを使用することで、メインの実行を途中で強制終了することなく、終了シグナルを確実に処理できます。このアプローチにより、正常なシャットダウンを実行でき、データの整合性が保証され、デーモンが正常に終了します。

以上がPython で SIGTERM シグナルを適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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