In der Python-Dokumentation heißt es:
Ein Thread kann als "Daemon-Thread" gekennzeichnet werden. Die Bedeutung dieses Flags besteht darin, dass das gesamte Python-Programm beendet wird, wenn nur noch Daemon-Threads übrig sind. Der Anfangswert wird vom Erstellungs-Thread geerbt.
Hat jemand eine klarere Erklärung, was das bedeutet, oder ein praktisches Beispiel, das zeigt, wo Sie Threads setzen würden daemonic
?
Klären Sie es für mich: Die einzige Situation, in der Sie Threads nicht festlegen würden daemonic
, ist, wenn Sie möchten, dass sie nach dem Beenden des Hauptthreads weiter ausgeführt werden?
quelle
None
in diesem Fall, aber es spielt keine Rolle, der Rückgabewert wird nicht verwendet.Angenommen, Sie erstellen eine Art Dashboard-Widget. Als Teil davon möchten Sie, dass die Anzahl der ungelesenen Nachrichten in Ihrer E-Mail-Box angezeigt wird. Also machst du einen kleinen Thread, der:
Wenn Ihr Widget gestartet wird, wird dieser Thread erstellt, als Daemon festgelegt und gestartet. Da es sich um einen Dämon handelt, müssen Sie nicht darüber nachdenken. Wenn Ihr Widget beendet wird, wird der Thread automatisch gestoppt.
quelle
Andere Poster gaben einige Beispiele für Situationen, in denen Sie Daemon-Threads verwenden würden. Meine Empfehlung ist jedoch, sie niemals zu verwenden.
Das liegt nicht daran, dass sie nicht nützlich sind, sondern daran, dass es einige schlimme Nebenwirkungen gibt, die auftreten können, wenn Sie sie verwenden. Daemon-Threads können weiterhin ausgeführt werden, nachdem die Python-Laufzeit begonnen hat, Dinge im Haupt-Thread abzureißen, was einige ziemlich bizarre Ausnahmen verursacht.
Mehr Infos hier:
https://joeshaw.org/python-daemon-threads-considered-harmful/
https://mail.python.org/pipermail/python-list/2005-February/343697.html
Genau genommen brauchen Sie sie nie, es erleichtert in einigen Fällen nur die Implementierung.
quelle
logging
und ich erwartete, dass nach Abschluss des Threads alle Objekte (Dateideskriptoren für jeden Thread / jede Funktion) zerstört werden würden. Am Ende meines Programms sah ich viele Ausgaben wieIOError: [Errno 24] Too many open files:
. Mitlsof -p pid_of_program
entdeckte ich, dass die FDs offen waren, auch wenn die Thread / Funktionen ihre Arbeit beendet haben. Problemumgehung? Entfernen des Protokollhandlers am Ende der Funktion. Alsodaemonic
Threads, sind nicht vertrauenswürdig ...Eine einfachere Möglichkeit, darüber nachzudenken: Wenn main zurückkehrt, wird Ihr Prozess nicht beendet, wenn noch Nicht-Daemon-Threads ausgeführt werden.
Ein kleiner Ratschlag: Das saubere Herunterfahren kann leicht falsch sein, wenn es um Threads und Synchronisation geht. Wenn Sie dies vermeiden können, tun Sie dies. Verwenden Sie nach Möglichkeit Daemon-Threads.
quelle
Chris hat bereits erklärt, was Daemon-Threads sind. Lassen Sie uns also über die praktische Verwendung sprechen. Viele Thread-Pool-Implementierungen verwenden Daemon-Threads für Task-Worker. Worker sind Threads, die Aufgaben aus der Aufgabenwarteschlange ausführen.
Der Mitarbeiter muss unbegrenzt auf Aufgaben in der Aufgabenwarteschlange warten, da er nicht weiß, wann eine neue Aufgabe angezeigt wird. Thread, der Aufgaben zuweist (z. B. Haupt-Thread), weiß nur, wann Aufgaben beendet sind. Der Hauptthread wartet in der Taskwarteschlange, bis er leer ist, und wird dann beendet. Wenn Worker Benutzer-Threads sind, dh keine Daemons, wird das Programm nicht beendet. Es wird weiter auf diese unbegrenzt laufenden Arbeiter warten, auch wenn die Arbeiter nichts Nützliches tun. Markieren Sie Worker-Daemon-Threads, und der Haupt-Thread kümmert sich darum, sie zu beenden, sobald die Aufgaben erledigt sind.
quelle
Zitat von Chris: "... wenn Ihr Programm beendet wird, werden alle Daemon-Threads automatisch beendet." Ich denke, das fasst es zusammen. Sie sollten vorsichtig sein, wenn Sie sie verwenden, da sie abrupt beendet werden, wenn das Hauptprogramm vollständig ausgeführt wird.
quelle
Wenn Ihr zweiter Thread kein Daemon ist, kann der primäre Hauptthread Ihrer Anwendung nicht beendet werden, da seine Beendigungskriterien auch mit dem Beenden von Nicht-Daemon-Threads verknüpft sind. Threads können in Python nicht zwangsweise beendet werden, daher muss Ihre App wirklich warten, bis die Nicht-Daemon-Threads beendet sind. Wenn dieses Verhalten nicht Ihren Wünschen entspricht, legen Sie Ihren zweiten Thread als Daemon fest, damit Ihre Anwendung nicht am Beenden gehindert wird.
quelle