シグナルハンドラーを登録することで、クリーンアップコードをsignal_handlerに入れることができます
signal.signal(signal.SIGINT, signal_handler)
ただし、問題は、ユーザーがctrl + cを複数回押すと、シグナルハンドラーが複数回実行され、クリーンアップがおかしくなることです。
私の問題は、終了前にクリーンアップハンドラーが1回だけ実行されていることを確認するにはどうすればよいかということです。
これがロックを使用した試行ですが、デッドロックが発生しています
def cleanup_handler():
lock.acquire()
if not done:
try:
cleanup()
done = True
finally:
print "release lock"
lock.release()
問題は、最終的にブロックが実行されないことです(つまり、「リリースロック」が印刷されているのがわかりません)。
備考
少し実験を行ったところ、シグナルハンドラが同時に実行されていないようです。新しいCtrl+Cを受信すると、古いハンドラーが強制終了され、新しいハンドラーが実行されます。私は正しいですか?はいの場合、ハンドラーが途中で終了することを望まないため、問題はより複雑になります。