web-dev-qa-db-fra.com

Signification de la propriété du démon sur les fils Python

Je suis un peu confus sur ce que signifie la définition d'un thread pour être un démon.

La documentation dit ceci:

Un thread peut être signalé comme un "thread démon". La signification de cet indicateur est que l'ensemble du programme Python se ferme lorsqu'il ne reste que des threads démon. La valeur initiale est héritée du thread de création. L'indicateur peut être défini via la propriété daemon.

Je ne sais pas ce qui le rend différent d'un fil normal.

Est-ce à dire que ce programme ne se terminera jamais?

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

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

Même si le thread principal termine son exécution. Alors se terminera immédiatement?

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

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

Je demande parce que j'ai une situation où dans mon thread principal j'appelle sys.exit (), et le processus se bloque et mes autres threads s'exécutent car je peux voir le journal.

Est-ce que cela a quelque chose à voir avec l'appel de sys.exit () avec des threads vivants?

42
Falmarri

Est-ce à dire que ce programme ne se terminera jamais?

Oui, ce programme ne se terminera pas, essayez-le.

Je demande parce que j'ai une situation où dans mon thread principal j'appelle sys.exit (), et le processus se bloque et mes autres threads s'exécutent car je peux voir le journal. Est-ce que cela a quelque chose à voir avec l'appel de sys.exit () avec des threads vivants?

Oui, même exit n'arrêtera pas les autres threads, il soulève simplement SystemExit dans le thread principal. Ainsi, bien que le thread principal s'arrête (comme il le fait pour toute autre exception non gérée), tous les autres threads non démoniaques continueront de fonctionner.

38
Jochen Ritzel

Réglage thread.daemon = True permettra de quitter le programme principal. Les applications attendent normalement que tous les fils enfants soient terminés avant de terminer.

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

Vous pouvez penser dans un thread Daemon comme un service, cela signifie qu'il s'exécutera en arrière-plan de votre ordinateur, effectuant différentes tâches, comme l'indexation de fichiers, l'analyse XML, la récupération de nouvelles, etc., tout ce qui est un processus long.

Votre thread principal se terminera et votre démon fonctionnera toujours en arrière-plan, c'est la raison pour laquelle votre programme aka Fin du thread principal, si vous voulez simplement mettre une boucle infinie et vous verrez votre thread toujours en cours d'exécution. Un exemple de thread démon est le garbage collection.

4
Alejandro Serret