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