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
)?
Réponses
Trop de publicités?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
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
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.
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.