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 )?

61
demandé sur Benyamin Jafari 2010-04-02 02:44:52

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

38
répondu rogeriopvl 2017-05-23 11:54:58

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

73
répondu ʇsәɹoɈ 2010-04-01 23:35:24

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.

11
répondu Alex Martelli 2010-04-02 02:43:04

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.

7
répondu Milean 2013-08-13 21:25:50

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.

2
répondu Benyamin Jafari 2018-08-28 07:30:34