2010-04-01 14 views

Antwort

35

Überprüfen Sie diese Frage. Die richtige Antwort hat eine große Erklärung, wie Fäden die richtige Weise zu beenden: Is there any way to kill a Thread in Python?

Um den Gewindeanschlag auf Tastatur-Interrupt-Signal (ctrl + c) machen Sie die Ausnahme „KeyboardInterrupt“ und Bereinigung vor dem Verlassen zu fangen. Wie folgt:

Auf diese Weise können Sie steuern, was zu tun ist, wenn das Programm abrupt beendet wird.

Sie können auch die Verwendung eingebauten Signalmodul, das Sie Setup-Signal-Handler (in Ihrem speziellen Fall das Signal SIGINT) lässt: http://docs.python.org/library/signal.html

+0

Vielen Dank für Ihre Antwort. Ich habe die Frage vielleicht nicht richtig formuliert. In dem Beispiel, das in dieser Frage angegeben wurde, war es immer noch notwendig, die stop() -Funktion des Threads auszuführen. Wenn ich ein Programm mit Strg + C abnormal beende, kann das nicht passieren. Also, meine Frage ist ein bisschen wie: "Wie rufe ich die Funktion mythread.stop() auf, wenn der Haupt-Threadfluss unterbrochen wird" – facha

+0

Ich habe meine Frage bearbeitet :) – rogeriopvl

+2

Wie hat noch niemand das Semikolon in Ihrem Codebeispiel bemerkt? Liebe es! –

65

Wenn Sie Threads machen Ihre Worker-Threads Daemon, werden sie sterben, wenn alle Nicht-Daemon-Threads (zB der Hauptthread) wurden beendet.

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

+2

Danke für die einfache und präzise Antwort, der voreingestellte threading.Thread Daemon-Status 'isDaemon()' ist False, setze ihn auf 'setDaemon (True) '. – Tony

+1

Dies beantwortet die Frage und funktioniert einfach. Die OP hat nicht gefragt, wie man Threads im Allgemeinen sauber verlässt. –

9

Verwenden Sie das atexit Modul von Python Standard-Bibliothek „termination“ Funktionen zu registrieren, die aufgerufen werden (auf dem Haupt-Thread) auf jede einigermaßen „sauber“ Beendigung des Haupt-Thread, darunter eine abgefangene Ausnahme wie KeyboardInterrupt. Solche Abbruchfunktionen können (wenn auch unvermeidlich im Hauptthread!) Jede gewünschte stop Funktion aufrufen; zusammen mit der Möglichkeit, einen Thread als daemon einzustellen, der Ihnen die Werkzeuge gibt, um die Systemfunktionalität richtig zu entwerfen, die Sie brauchen.

+0

Beachten Sie, dass dieser Ansatz funktioniert, ohne dämonische Threads in Python-Versionen vor 2.6.5 zu benötigen, siehe Antwort zu http://stackoverflow.com/questions/3713360/python-2-6-x-theading-signals-atexit-fail- auf einigen Versionen. Dies ist leider IMHO, da Daemon Threads beim Herunterfahren vor python 3.4 (http://bugs.python.org/issue19466) ein wenig durcheinander sind. Wenn Sie aufhören _und_ Ihren Daemon-Threads in Ihren atexit-Handlern beizutreten, sollte alles in Ordnung sein, zu den (wahrscheinlich unbedeutenden) Kosten der Serialisierung Ihres Thread-Teardowns. – NeilenMarais

4

Wenn Sie einen Thread wie folgt spawnen - myThread = Thread(target = function) - und dann tun Sie myThread.start(); myThread.join(). Wenn CTRL-C initiiert wird, wird der Hauptthread nicht beendet, da er auf diesen blockierenden myThread.join()-Aufruf wartet. Um dies zu beheben, setzen Sie einfach eine Zeitüberschreitung beim Aufruf von .join(). Die Zeitüberschreitung kann so lang sein, wie Sie möchten. Wenn Sie möchten, dass es auf unbestimmte Zeit wartet, geben Sie einfach ein sehr langes Timeout ein, wie 99999. Es ist auch eine gute Übung, myThread.daemon = True zu tun, damit alle Threads beendet werden, wenn der Hauptthread (Nicht-Daemon) beendet wird.

+0

'myThread.daemon = True' ist eine wunderbare Lösung für dieses Problem. – Brannon

+0

@Brannon '.daemon = True' ist keine feste Lösung. Überprüfen Sie diesen Thread für eine Erklärung: https://stackoverflow.com/a/20598791/5562492 –

Verwandte Themen