90

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

4

6 に答える 6

113

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

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

于 2010-04-01T23:35:24.410 に答える
47

この質問を確認してください。正解は、スレッドを正しい方法で終了する方法についての優れた説明 です。Pythonでスレッドを強制終了する方法はありますか?

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

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

このようにして、プログラムが突然終了したときに何をするかを制御できます。

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

于 2010-04-01T22:51:56.217 に答える
17

サブスレッドを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と)、他のスレッドも上記の手順で強制終了されます。

于 2018-08-07T09:28:06.883 に答える
12

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

于 2010-04-02T02:43:04.907 に答える
9

あなたがそのようにスレッドをスポーンするなら---myThread = Thread(target = function)そしてそれからmyThread.start(); myThread.join()myThread.join()CTRL-Cが開始されると、メインスレッドはそのブロッキング呼び出しを待機しているため、終了しません。これを修正するには、.join()呼び出しにタイムアウトを設定するだけです。タイムアウトは、必要なだけ長くすることができます。無期限に待機させたい場合は、99999のように非常に長いタイムアウトを設定しmyThread.daemon = Trueます。メインスレッド(デーモン以外)が終了するときにすべてのスレッドが終了するようにすることもお勧めします。

于 2013-08-13T21:25:50.530 に答える
4

デーモンスレッドは不正に強制終了されるため、ファイナライザー命令は実行されません。考えられる解決策は、無限ループではなくメインスレッドが稼働しているかどうかを確認することです。

例:Python 3の場合:

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

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

于 2019-08-21T06:08:22.323 に答える