Question

Si j'ai un fil dans une boucle infinie, est-il un moyen d'y mettre fin lorsque les principales extrémités du programme (par exemple, quand je presse Ctrl + C )?

Était-ce utile?

La solution

Cochez cette question. La bonne réponse a une grande explication sur la façon de mettre fin à des fils de la bonne façon: Est-il possible de tuer un thread en Python?

Pour l'arrêt de fil sur le clavier signal d'interruption (ctrl + c), vous pouvez attraper l'exception « KeyboardInterrupt » et le 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 ce qu'il faut faire à chaque fois que le programme est brusquement mis fin.

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

Autres conseils

Si vous faites votre threads de travail des fils de démon, ils vont mourir quand tous vos fils non-démon (par exemple, le thread principal) ont quitté.

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

Utilisez le module atexit de la bibliothèque standard de Python pour enregistrer des fonctions « de terminaison » qui s'appelle (sur le thread principal) sur tout raisonnablement la fin « propre » du fil principal, y compris une exception non interceptée, comme KeyboardInterrupt. Ces fonctions de terminaison peuvent (! Mais inévitablement dans le thread principal) appeler une fonction stop vous avez besoin; ainsi que la possibilité de mettre un fil comme daemon, qui vous donne les outils nécessaires pour concevoir correctement la fonctionnalité du système dont vous avez besoin.

Si vous frayer un fil comme si - myThread = Thread(target = function) - puis faire myThread.start(); myThread.join(). Quand est initié CTRL-C, le thread principal ne sort pas parce qu'il est en attente sur cet appel myThread.join() de blocage. Pour résoudre ce problème, il suffit de mettre dans un délai d'attente sur l'appel .join (). Le délai d'attente peut être aussi longtemps que vous le souhaitez. Si vous voulez attendre indéfiniment, il suffit de mettre dans un délai très long, comme 99999. Il est également bon de faire de sorte que tous myThread.daemon = True la sortie des fils lorsque le thread principal des sorties (non-démon).

Essayer de permettre au sous-fil comme démon-fil.

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

Or (en ligne):

from threading import Thread

threaded = Thread(target=<your-method>, daemon=True).start()

Lorsque vos principaux se termine de fil ( "par exemple, quand je presse Ctrl + C ") que d'autres fils tués à l'instruction ci-dessus.

fils Daemon sont tués disgracieuse donc des instructions de finaliseur ne sont pas exécutées. Une solution possible consiste à vérifier est thread principal est vivant à la place de boucle infinie.

par exemple. pour python 3:

while threading.main_thread().isAlive():
    do.you.subthread.thing()
gracefully.close.the.thread()

Voir Vérifiez si le thread principal est encore en vie d'un autre fil .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top