web-dev-qa-db-fra.com

Explication des threads de démon

Dans la documentation Python , Il est écrit:

Un fil peut être marqué en tant que "fil démon". La signification de cela flag est que tout le programme Python se ferme quand il n’ya que des threads de démon sont laissés. La valeur initiale est héritée du thread en création.

Quelqu'un at-il une explication plus claire de ce que cela signifie ou un exemple pratique montrant où vous souhaitez définir des threads comme étant daemonic?


Pour clarifier pour moi:

donc, la seule fois que vous ne voudriez pas définir les threads comme démoniaques, c'est si vous voulez qu'ils continuent à s'exécuter après la sortie du thread principal?

193
Corey Goldberg

Certains threads effectuent des tâches en arrière-plan, comme l'envoi de paquets keepalive, la collecte périodique des déchets, etc. Celles-ci ne sont utiles que lorsque le programme principal est en cours d'exécution, et vous pouvez les supprimer une fois que les autres threads, autres que des démons, se sont terminés.

Sans threads démon, vous devez les suivre et leur dire de quitter avant que votre programme ne puisse complètement quitter. En les définissant en tant que threads démon, vous pouvez les laisser s'exécuter et les oublier. Lorsque votre programme se ferme, tous les threads démons sont automatiquement supprimés.

378
Chris Jester-Young

Disons que vous créez une sorte de widget de tableau de bord. Dans ce contexte, vous souhaitez afficher le nombre de messages non lus dans votre boîte aux lettres. Donc, vous faites un petit fil qui va:

  1. Connectez-vous au serveur de messagerie et demandez combien de messages non lus vous avez.
  2. Signalez l'interface graphique avec le nombre mis à jour.
  3. Dors un peu.

Lorsque votre widget démarre, il crée ce fil, le désigne comme démon et le démarre. Parce que c'est un démon, vous n'avez pas à y penser; lorsque votre widget se ferme, le fil s'arrête automatiquement.

24
John Fouhy

Une façon plus simple d’y réfléchir, par exemple: lors du retour de main, votre processus ne se terminera pas si des threads autres que des démons sont toujours en cours d’exécution.

Un petit conseil: Il est facile de se tromper en arrêtant en cas de threads et de synchronisation - si vous pouvez l'éviter, faites-le. Utilisez les threads démon autant que possible.

14
Jonathan

D'autres affiches ont donné des exemples de situations dans lesquelles vous utiliseriez des threads de démon. Ma recommandation, cependant, est de ne jamais les utiliser.

Ce n'est pas parce qu'ils ne sont pas utiles, mais parce qu'il existe certains effets secondaires néfastes que vous pouvez ressentir si vous les utilisez. Les threads de démon peuvent toujours s'exécuter après que le moteur d'exécution Python commence à détruire des éléments du thread principal, ce qui provoque des exceptions plutôt bizarres.

Plus d'infos ici:

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

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

Strictement parlant, vous n'en avez jamais besoin, cela facilite simplement la mise en œuvre dans certains cas.

11
Joe Shaw

Chris a déjà expliqué ce que sont les threads de démon, parlons donc de l’utilisation pratique. De nombreuses implémentations de pools de threads utilisent des threads de démon pour les travailleurs des tâches. Les travailleurs sont des threads qui exécutent des tâches à partir de la file d'attente. 

Le travailleur doit attendre indéfiniment que des tâches soient dans la file d'attente des tâches, car il ne sait pas quand une nouvelle tâche apparaîtra. Le fil qui assigne des tâches (par exemple le fil principal) ne sait que quand les tâches sont terminées. Le thread principal attend que la file d'attente des tâches soit vide puis quitte. Si les travailleurs sont des threads d’utilisateur, c’est-à-dire non démon, le programme ne se termine pas. Il continuera d'attendre ces travailleurs qui courent indéfiniment, même s'ils ne font rien d'utile. Marquez les threads de démon des travailleurs, et le thread principal se chargera de les tuer dès que ce sera fait. 

9
Amit

Citation de Chris: "... lorsque votre programme se ferme, tous les threads de démon sont supprimés automatiquement.". Je pense que cela résume. Soyez prudent lorsque vous les utilisez car ils se terminent abruptement lorsque le programme principal s'exécute complètement.

5
Bass

Lorsque votre deuxième thread n'est pas un démon, le thread principal principal de votre application ne peut pas quitter car ses critères de sortie sont liés à la sortie également de thread (s) non-daemon. Les threads ne peuvent pas être supprimés de force en python. Par conséquent, votre application devra attendre réellement que les threads non-Daemon soient fermés. Si ce comportement ne vous convient pas, définissez votre deuxième thread en tant que démon afin qu'il ne empêche pas votre application de quitter. 

0
typelogic