Python: wie ein Thread zu beenden, wenn Hauptprogramm Ende
-
23-09-2019 - |
Frage
Wenn ich einen Thread in einer Endlos-Schleife habe, ist es eine Möglichkeit, es zu beenden, wenn das Hauptprogramm endet (zum Beispiel, wenn ich die Taste Strg + C )?
Lösung
Sehen Sie sich diese Frage. Die richtige Antwort hat eine große Erklärung, wie Fäden die richtige Weise zu beenden: Gibt es eine Möglichkeit einen Thread in Python zu töten?
Um den Gewindeanschlag auf Tastatur-Interrupt-Signal zu machen (ctrl + c) Sie die Ausnahme abfangen können „KeyboardInterrupt“ und Bereinigung vor dem Beenden. Wie folgt aus:
try:
start_thread()
except (KeyboardInterrupt, SystemExit):
cleanup_stop_thread()
sys.exit()
Auf diese Weise können, was die Steuerung zu tun, wann immer das Programm abrupt beendet wird.
Sie können auch die eingebauten Signalmodul verwenden, die Sie Setup-Signal-Handler (in Ihrem speziellen Fall das Signal SIGINT) lässt: http://docs.python.org/library/signal.html
Andere Tipps
Wenn Sie Ihre Arbeiter machen Threads Daemon-Threads, sie werden sterben, wenn alle Ihre Nicht-Daemon-Threads (z.B. der Haupt-Thread) verlassen haben.
http://docs.python.org/library/threading. html # threading.Thread.daemon
Mit dem atexit Modul von Python-Standardbibliothek „Beendigung“ Funktionen zu registrieren, die (auf dem Haupt-Thread) auf jede einigermaßen „saubere“ Beendigung des Haupt-Threads, einschließlich einer abgefangene Ausnahme wie KeyboardInterrupt
aufgerufen. Eine solche Kündigung Funktionen aufrufen (wenn auch zwangsläufig im Hauptthread!) Kann eine beliebige stop
Funktion benötigen Sie; zusammen mit der Möglichkeit, einen Faden als daemon
der Einstellung, die Sie die Werkzeuge richtig gestalten die Systemfunktionalität benötigen Sie.
Wenn Sie ein Thema wie so laichen - myThread = Thread(target = function)
- und dann tun myThread.start(); myThread.join()
. Wenn CTRL-C initiiert wird, wird der Hauptthread nicht verlassen, weil sie auf der Blockierung myThread.join()
Anruf wartet. Um dies zu beheben, setzen Sie einfach in einem Timeout auf dem .join () -Aufruf. Das Timeout kann so lang sein, wie Sie wollen. Wenn Sie es wollen, auf unbestimmte Zeit warten, nur setzte sich in eine wirklich lange Timeout, wie 99999. Es ist auch gut Praxis myThread.daemon = True
so alle Fäden beendet werden, wenn der Haupt-Thread (nicht-Daemon) Ausfahrten zu tun.
Versuchen Sie es mit ermöglicht den Sub-Thread als Daemon-Thread.
Beispiel:
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()
oder (in einer Zeile):
from threading import Thread
threaded = Thread(target=<your-method>, daemon=True).start()
Wenn Ihr Haupt-Thread beendet ( "zum Beispiel, wenn ich die Taste Strg + C "), dass andere Threads töten mit oben Anweisung.
sind Daemon-Threads getötet ungracefully so dass alle Finalizerthread Anweisungen nicht ausgeführt. Eine mögliche Lösung ist, zu überprüfen, ist Haupt-Thread statt Endlosschleife am Leben ist.
z. für Python 3:
while threading.main_thread().isAlive():
do.you.subthread.thing()
gracefully.close.the.thread()
Siehe Überprüfen Sie, ob die Haupt-Thread noch am leben von einem anderen Thread .