web-dev-qa-db-ja.com

python:メインプログラムの終了時にスレッドを終了する方法

無限ループにスレッドがある場合、メインプログラムが終了したときにスレッドを終了する方法はありますか(たとえば、 Ctrl+C)?

72
facha

この質問を確認してください。正しい答えには、正しい方法でスレッドを終了する方法に関する素晴らしい説明があります: Pythonでスレッドを強制終了する方法はありますか?

キーボード割り込み信号(ctrl + c)でスレッドを停止するには、終了する前に例外 "KeyboardInterrupt"をキャッチしてクリーンアップします。このような:

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread()
    sys.exit()

この方法により、プログラムが突然終了したときの処理を制御できます。

また、シグナルハンドラー(特定のケースではSIGINTシグナル)をセットアップできる組み込みシグナルモジュールを使用することもできます。 http://docs.python.org/library/signal.html

42
rogeriopvl

ワーカースレッドをデーモンスレッドにすると、すべての非デーモンスレッド(メインスレッドなど)が終了したときに死にます。

http://docs.python.org/library/threading.html#threading.Thread.daemon

83
ʇsәɹoɈ

Pythonの標準ライブラリの atexit モジュールを使用して、KeyboardInterruptなどのキャッチされない例外を含む、メインスレッドの「クリーン」な終了時に(メインスレッドで)呼び出される「終了」関数を登録します。このような終了関数は、(必然的にメインスレッドで!)必要なstop関数を呼び出します。スレッドをdaemonとして設定する可能性とともに、必要なシステム機能を適切に設計するツールを提供します。

12
Alex Martelli

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")他のスレッドが上記の命令で殺すこと。

8
Benyamin Jafari

myThread = Thread(target = function)-のようなスレッドを生成し、myThread.start(); myThread.join()を実行した場合。 CTRL-Cが開始されると、メインスレッドはそのmyThread.join()呼び出しを待機しているため終了しません。これを修正するには、単に.join()呼び出しにタイムアウトを設定します。タイムアウトはあなたが望む限り長くすることができます。無期限に待機させたい場合は、99999のような非常に長いタイムアウトを設定するだけです。myThread.daemon = Trueそのため、メインスレッド(非デーモン)が終了すると、すべてのスレッドが終了します。

8
Milean

デーモンスレッドは不意に終了するため、ファイナライザの指示は実行されません。可能な解決策は、メインスレッドが無限ループではなく生きていることを確認することです。

例えば。 for Python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

メインスレッドが別のスレッドからまだ生きているかどうかを確認する を参照してください。

0
umi