私が取り組んでいるアプリのモジュールの 1 つは、Linux で長時間実行されるプロセスとして使用することを目的としており、SIGTERM、SIGHUP、およびその他のシグナルを適切に処理したいと考えています。プログラムのコア部分は、実際には関数を定期的に実行するループです (別のスレッドを起動しますが、これはそれほど重要ではありません)。多かれ少なかれ次のようになります。
while True:
try:
do_something()
sleep(60)
except KeyboardInterrupt:
break
cleanup_and_exit()
KeyboardInterrupt
ここで追加したいのは、例外と同じように、SIGTERM をキャッチしてループを終了することです。
私が考えていることの 1 つは、シグナル ハンドラー関数によって True に設定されるフラグを追加し、sleep(60) を sleep(0.1) などに置き換えて、秒をカウントするカウンターに置き換えることです。
_exit_flag = False
while not _exit_flag:
try:
for _ in xrange(600):
if _exit_flag: break
do_something()
sleep(0.1)
except KeyboardInterrupt:
break
cleanup_and_exit()
そして他の場所:
def signal_handler(sig, frame):
_exit_flag = True
しかし、これが最善/最も効率的な方法であるかどうかはわかりません。