web-dev-qa-db-ja.com

Pythonスレッドのデーモンプロパティの意味

スレッドをデーモンに設定することの意味について少し混乱しています。

ドキュメントにはこう書かれています:

スレッドは、「デーモンスレッド」としてフラグを立てることができます。このフラグの重要性は、デーモンスレッドのみが残っている場合、Pythonプログラム全体が終了することです。初期値は作成スレッドから継承されます。このフラグはデーモンプロパティで設定できます。

これが通常のスレッドと何が違うのかわかりません。

これは、このプログラムが終了しないということですか?

def threadfunc():
    while True:
        time.sleep(1)

threading.Thread(target=threadfunc).start()

メインスレッドが終了しても、実行されます。すぐに終了しますか?

def threadfunc():
    while True:
        time.sleep(1)

th = threading.Thread(target=threadfunc)
th.daemon = True
th.start()

メインスレッドでsys.exit()を呼び出しており、プロセスがハングし、他のスレッドがログを見ることができるように実行されている状況があるため、私は尋ねます。

これは、生きているスレッドで呼び出されるsys.exit()と関係がありますか?

42
Falmarri

これは、このプログラムが終了しないということですか?

はい、そのプログラムは終了せず、試してみてください。

メインスレッドでsys.exit()を呼び出しており、プロセスがハングし、他のスレッドがログを見ることができるように実行されている状況があるため、私は尋ねます。これは、生きているスレッドで呼び出されるsys.exit()と関係がありますか?

はい、exitでも他のスレッドは停止しません。メインスレッドでSystemExitが発生するだけです。そのため、メインスレッドは(他の未処理の例外で行うように)停止しますが、他のすべての非デーモンスレッドは引き続き動作します。

38
Jochen Ritzel

設定thread.daemon = Trueは、メインプログラムの終了を許可します。アプリは通常、すべての子スレッドが完了するまで待ってから完了します。

13
TelegramSam
th.daemon = True #set this thread as a Daemon Thread

Daemonスレッドはサービスとして考えることができます。これは、ファイルのインデックス付け、xmlの解析、ニュースの取得など、長時間実行されるプロセスなど、さまざまなタスクを実行するコンピューターのバックグラウンドで実行されることを意味します。

メインスレッドは終了し、デーモンはバックグラウンドで実行されたままです。これが、メインスレッドとも呼ばれるプログラムが終了する理由です。無限ループを作成しただけで、スレッドが実行されていることがわかります。デーモンスレッドの例は、ガベージコレクションです。

4