Wenn ich einen Thread in einer Endlosschleife habe, gibt es eine Möglichkeit, es zu beenden, wenn das Hauptprogramm endet (zum Beispiel, wenn ich ctrl+C
drücke)?Python: Wie man einen Thread beendet, wenn Hauptprogramm endet
Antwort
Ü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
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
Danke für die einfache und präzise Antwort, der voreingestellte threading.Thread Daemon-Status 'isDaemon()' ist False, setze ihn auf 'setDaemon (True) '. – Tony
Dies beantwortet die Frage und funktioniert einfach. Die OP hat nicht gefragt, wie man Threads im Allgemeinen sauber verlässt. –
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.
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
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.
'myThread.daemon = True' ist eine wunderbare Lösung für dieses Problem. – Brannon
@Brannon '.daemon = True' ist keine feste Lösung. Überprüfen Sie diesen Thread für eine Erklärung: https://stackoverflow.com/a/20598791/5562492 –
- 1. Wie man einen Std :: Thread beendet?
- 2. Python: Wie erkennen, wenn mein Thread verwaist?
- 3. Beenden Sie Child-Threads, wenn das übergeordnete Thread beendet wird
- 4. Wie man einen hängenden Thread innerhalb einer DLL korrekt beendet?
- 5. Thread beendet Event in Python
- 6. Wie man einen Thread beendet, der den Webbrowser in Python aufruft
- 7. Wie man einen Rust-Thread von einem anderen Thread beendet oder aussetzt?
- 8. Python beenden einen Thread, wenn es schläft
- 9. Warten Sie, bis die Funktion beendet ist, bevor Sie das Hauptprogramm (ein Thread) fortsetzen
- 10. Wie funktioniert das Betriebssystem, wenn ein Thread beendet wurde?
- 11. Stoppt einen Thread Python
- 12. Wie säubere ich einen Thread, nachdem seine Ausführungsmethode beendet wurde?
- 13. Wie man einen 'Debug' Modus beendet?
- 14. Wie weckt man am besten einen schlafenden Python-Thread?
- 15. Wie beendet man eine While-Schleife in Python?
- 16. Siehe Thread nicht korrekt beendet
- 17. Die Erstellung von std :: thread verlangsamt das Hauptprogramm um 50%
- 18. Python-Threading. Wie sperre ich einen Thread?
- 19. Erkennen, wenn BaseAdapter.notifyDataSetChanged() beendet
- 20. Wie man einen blockierenden Thread ohne veralteten Thread suspendiert?
- 21. Wie man einen Ton einmal oder bis die Animation endet?
- 22. Wie man einen Thread basierend auf Thread-ID sperren?
- 23. Wie startet man einen Thread in Clojure?
- 24. XAMPP beendet Arbeiter-Thread 0
- 25. Öffnen eines wx.Frame in Python über einen neuen Thread
- 26. Wie fügt man Destruktor für einen Thread hinzu?
- 27. Wie man einen Autor Thread verhungern lässt
- 28. Wann endet ein Thread nicht mehr?
- 29. Cron beendet Python Script?
- 30. Wie lösche ich das Boost-Thread-Objekt, wenn der Thread selbst beendet wird?
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
Ich habe meine Frage bearbeitet :) – rogeriopvl
Wie hat noch niemand das Semikolon in Ihrem Codebeispiel bemerkt? Liebe es! –