105 votes

python: comment terminer un thread à la fin du programme principal

Si vous avez un fil en boucle infinie, existe-t-il un moyen de le terminer lorsque le programme principal se termine (par exemple, lorsque j'appuie sur ctrl+C )?

133voto

ʇsәɹoɈ Points 8284

Si vous créez des threads démon pour vos threads de travail, ils mourront lorsque tous vos threads autres que les démons (par exemple, le thread principal) seront terminés.

http://docs.python.org/library/threading.html#threading.Thread.daemon

48voto

rogeriopvl Points 9619

Cochez cette question. La bonne réponse a la grande explication sur la façon de résilier le fils de la bonne façon: http://stackoverflow.com/questions/323972/is-there-any-way-to-kill-a-thread-in-python

Pour faire le fil d'arrêt sur le Clavier signal d'Interruption (ctrl+c), vous pouvez intercepter l'exception "KeyboardInterrup" et de nettoyage avant de quitter. Comme ceci:

try:
    start_thread()  
except (KeyboardInterrupt, SystemExit):
    cleanup_stop_thread();
    sys.exit()

De cette façon, vous pouvez contrôler quoi faire à chaque fois que le programme est brusquement interrompu.

Vous pouvez également utiliser l'intégré dans le module de signal qui vous permet de configurer les gestionnaires de signaux (dans votre cas particulier, le signal SIGINT): http://docs.python.org/library/signal.html

12voto

Alex Martelli Points 330805

Utiliser le atexit module de Python à la bibliothèque standard de registre "résiliation" des fonctions qui appelés (sur le thread principal) sur toute raisonnablement "nettoyer" la terminaison du thread principal, y compris une exception non interceptée comme KeyboardInterrupt. Ces fonctions d'arrêt peut (même si, inévitablement, dans le thread principal!) appeler n'importe quel stop de la fonction dont vous avez besoin, avec la possibilité de création d'un thread ( daemon, qui vous donne les outils pour concevoir le système fonctionnalités dont vous avez besoin.

9voto

Mystex Points 31

Si vous frayer un Fil comme soi - myThread = Thread(target = function) - et puis n' myThread.start(); myThread.join(). Lorsque "CTRL-C" est lancé, le thread principal ne veut pas le quitter car il est en attente sur que le blocage de la myThread.join() appel. Pour corriger cela, il suffit de mettre dans un timeout sur la .join() de l'appel. Le délai peut être aussi long que vous le souhaitez. Si vous voulez attendre indéfiniment, il suffit de mettre dans un très long délai d'attente, comme 99999. C'est aussi une bonne pratique pour ne myThread.daemon = True de sorte que tous les fils de sortie lorsque le thread principal(non-démon) sorties.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X