無限ループにスレッドがある場合、メインプログラムが終了したとき(たとえば、Ctrl+を押したときC)にスレッドを終了する方法はありますか?
6 に答える
ワーカースレッドをデーモンスレッドにすると、デーモン以外のすべてのスレッド(メインスレッドなど)が終了したときにスレッドが停止します。
http://docs.python.org/library/threading.html#threading.Thread.daemon
この質問を確認してください。正解は、スレッドを正しい方法で終了する方法についての優れた説明 です。Pythonでスレッドを強制終了する方法はありますか?
キーボード割り込み信号(ctrl + c)でスレッドを停止させるには、例外「KeyboardInterrupt」をキャッチして、終了する前にクリーンアップします。このような:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
このようにして、プログラムが突然終了したときに何をするかを制御できます。
シグナルハンドラー(特定の場合はSIGINTシグナル)をセットアップできる組み込みのシグナルモジュールを使用することもできます:http://docs.python.org/library/signal.html
サブスレッドをdaemon-threadとして有効にしてみてください。
例えば:
おすすめされた:
from threading import Thread
t = Thread(target=<your-method>)
t.daemon = True # This thread dies when main thread (only non-daemon thread) exits.
t.start()
列をなして:
t = Thread(target=<your-method>, daemon=True).start()
古いAPI:
t.setDaemon(True)
t.start()
Ctrlメインスレッドが終了すると(つまり、「 + 」を押すCと)、他のスレッドも上記の手順で強制終了されます。
Pythonの標準ライブラリのatexitモジュールを使用して、メインスレッドの合理的に「クリーンな」終了時に(メインスレッドで)呼び出される「終了」関数を登録します。これには、などのキャッチされない例外が含まれKeyboardInterrupt
ます。このような終了関数は(必然的にメインスレッドで!)stop
必要な関数を呼び出すことができます。スレッドをとして設定する可能性とともに、daemon
必要なシステム機能を適切に設計するためのツールを提供します。
あなたがそのようにスレッドをスポーンするなら---myThread = Thread(target = function)
そしてそれからmyThread.start(); myThread.join()
。myThread.join()
CTRL-Cが開始されると、メインスレッドはそのブロッキング呼び出しを待機しているため、終了しません。これを修正するには、.join()呼び出しにタイムアウトを設定するだけです。タイムアウトは、必要なだけ長くすることができます。無期限に待機させたい場合は、99999のように非常に長いタイムアウトを設定しmyThread.daemon = True
ます。メインスレッド(デーモン以外)が終了するときにすべてのスレッドが終了するようにすることもお勧めします。
デーモンスレッドは不正に強制終了されるため、ファイナライザー命令は実行されません。考えられる解決策は、無限ループではなくメインスレッドが稼働しているかどうかを確認することです。
例:Python 3の場合:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
メインスレッドが別のスレッドからまだ生きているかどうかを確認するを参照してください。