python: comment mettre fin à un thread lorsque le programme principal se termine
si j'ai un thread dans une boucle infinie, y a-t-il un moyen de l'arrêter quand le programme principal se termine (par exemple, quand j'appuie sur Ctrl + C )?
5 réponses
Cochez cette question. La bonne réponse a une grande explication sur la façon d'arrêter les threads de la bonne façon: y a-t-il un moyen de tuer un fil en Python?
pour arrêter le thread sur le signal D'interruption du clavier (ctrl+c), vous pouvez attraper l'exception" KeyboardInterrupt " et le nettoyage avant de sortir. Comme ceci:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
de cette façon, vous pouvez contrôler ce qu'il faut faire chaque fois que le programme est brusquement terminé.
vous pouvez également utiliser le module de signal intégré qui vous permet de configurer les gestionnaires de signal (dans votre cas spécifique le signal SIGINT): http://docs.python.org/library/signal.html
si vous faites vos fils de démon worker threads, ils mourront quand tous vos fils non-démon (par exemple le fil principal) seront sortis.
http://docs.python.org/library/threading.html#threading.Thread.daemon
utilisez le atexit module de la bibliothèque standard de Python pour enregistrer les fonctions de" termination "qui sont appelées (sur le thread principal) sur n'importe quelle terminaison raisonnablement" propre "du thread principal, y compris une exception non récupérée telle que KeyboardInterrupt
. De telles fonctions de terminaison peuvent (bien que inévitablement dans le fil principal!) appelez n'importe quelle fonction stop
dont vous avez besoin; avec la possibilité de définir un thread comme daemon
, qui vous donne les outils pour concevez correctement les fonctionnalités du système dont vous avez besoin.
si vous produisez un fil comme so - myThread = Thread(target = function)
- et puis faire myThread.start(); myThread.join()
. Lorsque CTRL-C est initié, le thread principal ne sort pas car il attend l'appel de blocage myThread.join()
. 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 que ça attende indéfiniment, mettez juste un délai vraiment long, comme 99999. C'est aussi une bonne pratique de faire myThread.daemon = True
pour que tous les threads sortent quand le thread principal(non-démon) sort.
essayez d'activer le sous-thread comme DAEMON-thread.
Par Exemple:
from threading import Thread
threaded = Thread(target=<your-method>)
threaded.daemon = True # This thread dies when main thread (only non-daemon thread) exits.
threaded.start()
ou (dans une ligne):
from threading import Thread
threaded = Thread(target=<your-method>, daemon=True).start()
lorsque votre fil principal se termine ("par exemple, lorsque j'appuie sur Ctrl + C ") que d'autres fils tue avec l'instruction ci-dessus.