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

War es hilfreich?

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.

gibt

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 .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top