無限ループにスレッドがある場合、メインプログラムが終了したとき(たとえば、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
cleanup_stop_thread()
私が使用できるグローバル関数は?またはそれを実装する必要がありますか?
ワーカースレッドをデーモンスレッドにすると、デーモン以外のスレッド(メインスレッドなど)がすべて終了したときにスレッドが停止します。
http://docs.python.org/library/threading.html#threading.Thread.daemon
isDaemon()
はFalsesetDaemon(True)
です。でTrueに設定してください。
isDaemon()
そしてsetDaemon()
、古いゲッター/セッターです(上記のリンクされたドキュメントによる)、ちょうど使用daemon=True
してくださいthreading.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
必要なシステム機能を適切に設計するためのツールを提供します。
atexit.register()
Pythonモジュールでの呼び出しが延期されたために奇妙なことが起こり、終了プロシージャがの後に実行される可能性があることに注意してくださいmultiprocessing
。私はこの問題に対処する上で実行するQueue
とdaemon
、スレッド:「EOFエラーを」マルチプロセッシングキューとスレッドを使用してプログラムの終了時に。
atexit
デーモン以外のスレッドが動作していてメインスレッドが終了している場合、ハンドラーは呼び出されません。atexitを使用してスレッドを終了するときにスクリプトが終了時にスタックするを参照してください。
あなたがそのようにスレッドをスポーンするなら---myThread = Thread(target = function)
そしてそれからmyThread.start(); myThread.join()
。CTRL-Cが開始されると、メインスレッドはそのブロッキングmyThread.join()
呼び出しを待機しているため、終了しません。これを修正するには、.join()呼び出しにタイムアウトを設定するだけです。タイムアウトは必要なだけ長くすることができます。無期限に待機させたい場合は、99999のように非常に長いタイムアウトを設定しmyThread.daemon = True
ます。メインスレッド(デーモン以外)が終了するときにすべてのスレッドが終了するようにすることもお勧めします。
myThread.daemon = True
この問題の素晴らしい解決策です。
.daemon=True
は固溶体ではありません。説明については、このスレッドを確認してください:stackoverflow.com/a/20598791/5562492
デーモンスレッドは不正に強制終了されるため、ファイナライザー命令は実行されません。考えられる解決策は、無限ループではなくメインスレッドが動作しているかどうかを確認することです。
例:Python 3の場合:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()