273

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

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

誰かがそれが何を意味するのかについてより明確な説明や、スレッドをどこに設定するかを示す実際的な例を持っていますdaemonicか?

私のためにそれを明確にしてください:それで、あなたがスレッドを設定しない唯一の状況はdaemonic、メインスレッドが終了した後もそれらを実行し続けたいときですか?

4

8 に答える 8

509

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

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

于 2008-10-10T03:27:36.143 に答える
32

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

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

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

于 2008-10-10T03:36:16.703 に答える
19

他の投稿者は、デーモン スレッドを使用する状況の例をいくつか示しました。ただし、決して使用しないことをお勧めします。

それらが役に立たないからではなく、それらを使用すると発生する可能性のあるいくつかの悪い副作用があるためです. デーモン スレッドは、Python ランタイムがメイン スレッド内のものを解体し始めた後も実行でき、かなり奇妙な例外が発生します。

詳細はこちら:

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

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

厳密に言えば、それらは必要ありません。場合によっては、実装が簡単になるだけです。

于 2009-02-24T22:55:10.797 に答える
18

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

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

于 2008-10-10T04:34:28.660 に答える
12

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

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

于 2016-08-27T14:40:41.883 に答える
11

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

于 2011-08-12T18:14:15.263 に答える
6

また、ここにいくつかのビットを追加します。デーモンスレッドがほとんどの人を混乱させている理由の一部は(少なくとも私にはそうでした)、理解するのが本当に明確ではないのは、単語の意味ですdameon

Unix の用語daemonは、生成されてバックグラウンドで実行され続けるプロセスを指し、ユーザーはフォアグラウンド プロセスで他の処理に進むことができます。

Python のスレッド化コンテキストでは、作成時のすべてのスレッドはバックグラウンドで実行されます。その違いは、これらのスレッドがメイン スレッドにどのように影響するかという事実から生じますdaemonnon-daemonスレッドがある場合、そのnon-daemonようなすべてのnon-daemonスレッドが実行を完了するまでメイン スレッドは終了しないため、ある意味でメイン スレッドがブロックされます。

スレッドでdaemonはバックグラウンドで実行されますが、メイン スレッドをブロックせず、メイン スレッドが完了して終了するとすぐにすべてのdaemonスレッドが取得されるという 1 つの重要な違いがあります。これにより、非同期で実行したい操作に役立ちますが、メインアプリケーションが終了するとすぐに、これらの操作も終了する必要があります。

注意すべき点の 1 つは、daemonスレッドで正確に何を行っているかを認識しておく必要があるということです。メイン スレッドの終了時にスレッドが終了するという事実は、予期しない驚きをもたらす可能性があります。

スレッドについて混乱したもう 1 つのことdaemonは、python ドキュメントの定義です。

このフラグの意味は、デーモン スレッドだけが残ったときに Python プログラム全体が終了することです。

簡単に言えば、これが意味することは、プログラムにスレッドdaemonnon-daemonスレッドの両方がある場合、メインプログラムはブロックされ、すべてが終了するまで待機し、non-daemonメインスレッドを終了するとすぐに終了することです。このステートメントも意味しますが、一見すると明確ではありませんがdaemon、メイン スレッドが終了すると、すべてのスレッドが自動的に終了するということです。

于 2021-07-28T07:36:26.467 に答える