web-dev-qa-db-ja.com

デーモンスレッドの説明

Pythonドキュメント には次のように書かれています:

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

誰がその意味の明確な説明や、スレッドをdaemonicとして設定するかを示す実用的な例がありますか?


私のために明確にするために:

だからあなたがスレッドをデーモンとして設定しないのは、メインスレッドが終了した後もスレッドを実行し続けたい場合だけですか?

214
Corey Goldberg

一部のスレッドは、キープアライブパケットの送信、定期的なガベージコレクションの実行など、バックグラウンドタスクを実行します。これらは、メインプログラムが実行されている場合にのみ有用であり、デーモンではない他のスレッドが終了したら、それらを強制終了してもかまいません。

デーモンスレッドがなければ、プログラムを完全に終了する前に、デーモンスレッドを追跡し、終了するように指示する必要があります。それらをデーモンスレッドとして設定することにより、それらを実行してそれらを忘れさせることができ、プログラムが終了すると、デーモンスレッドは自動的に強制終了されます。

408

ある種のダッシュボードウィジェットを作成しているとしましょう。その一環として、未読メッセージ数をメールボックスに表示する必要があります。そのため、次のことを行う小さなスレッドを作成します。

  1. メールサーバーに接続し、未読メッセージの数を尋ねます。
  2. 更新されたカウントでGUIに通知します。
  3. しばらく寝ます。

ウィジェットが起動すると、このスレッドが作成され、デーモンとして指定されて起動されます。デーモンであるため、考える必要はありません。ウィジェットが終了すると、スレッドは自動的に停止します。

25
John Fouhy

考えてみるともっと簡単な方法です。おそらく、mainが戻ったときに、デーモン以外のスレッドがまだ実行されている場合、プロセスは終了しません。

ちょっとしたアドバイス:クリーンシャットダウンは、スレッドと同期が関係している場合は簡単に間違ってしまいます。回避できる場合はそうしてください。可能な限りデーモンスレッドを使用します。

14
Jonathan

他のポスターは、デーモンスレッドを使用する状況の例を示しています。しかし、私の推奨事項は決して使用しないことです。

それらが有用ではないからではなく、それらを使用すると経験できるいくつかの悪い副作用があるからです。デーモンスレッドは、Pythonランタイムがメインスレッドの内容を破棄し始めた後も実行できるため、かなり奇妙な例外が発生します。

詳細はこちら:

https://joeshaw.org/python-daemon-threads-considered-harmful/

https://mail.python.org/pipermail/python-list/2005-February/343699.html

厳密に言えば、それらは決して必要ではなく、場合によっては実装を簡単にします。

13
Joe Shaw

クリスはすでにデーモンスレッドとは何かを説明したので、実際の使用法について話しましょう。多くのスレッドプール実装は、タスクワーカーにデーモンスレッドを使用します。ワーカーは、タスクキューからタスクを実行するスレッドです。

ワーカーは、新しいタスクがいつ表示されるかわからないため、タスクキュー内のタスクを無期限に待機する必要があります。タスクを割り当てるスレッド(メインスレッドなど)は、タスクが終了したときのみ認識します。メインスレッドは、タスクキューで空になるまで待機してから終了します。ワーカーがユーザースレッド、つまり非デーモンの場合、プログラムは終了しません。ワーカーは何の役にも立たないにもかかわらず、これらの無期限に実行されるワーカーを待ち続けます。ワーカーデーモンスレッドにマークを付けると、メインスレッドはタスクの処理が完了するとすぐにそれらを強制終了します。

9
Amit

クリスの引用:「...プログラムが終了すると、デーモンスレッドは自動的に強制終了されます。」私はそれを要約すると思います。メインプログラムが完了して実行されると突然終了するため、使用する場合は注意が必要です。

7
Bass

2番目のスレッドが非デーモンの場合、アプリケーションのプライマリメインスレッドは終了基準が非デーモンスレッドの出口にも関連付けられているため、終了できません。スレッドをPythonで強制的に強制終了することはできないため、アプリは、非デーモンスレッドが終了するまで実際に待機する必要があります。この動作が望んでいない場合は、2番目のスレッドをデーモンとして設定し、アプリケーションの終了を妨げないようにします。

0
typelogic