Vom docs:
Hinweis: Daemon-Threads beim Abschalten abrupt gestoppt. Ihre Ressourcen (z. B. offene Dateien, Datenbanktransaktionen usw.) werden möglicherweise nicht ordnungsgemäß freigegeben. Wenn Sie möchten, dass Ihre Threads ordnungsgemäß beendet werden, machen Sie sie nicht-dämonisch und verwenden Sie einen geeigneten Signalmechanismus wie z. B. ein Event.
Dies läßt darauf schließen, aber nicht völlig Zustand sind, dass Daemon-Threads für __exit__
Methoden ohne Chance beendet und finally
Blöcke zu laufen. Wir können ein Experiment durchgeführt, um sicherzustellen, dass dies der Fall ist:
import contextlib
import threading
import time
@contextlib.contextmanager
def cm():
try:
yield
finally:
print 'in __exit__'
def f():
with cm():
print 'in with block'
event.set()
time.sleep(10)
event = threading.Event()
t = threading.Thread(target=f)
t.daemon = True
t.start()
event.wait()
wo wir einen Dämon-Thread starten und lassen Sie ihn in einem with
Block schlafen, wenn die Haupt-Thread beendet. Wenn wir run the experiment wir eine Leistung von
in with block
aber keine in __exit__
erhalten, so dass die __exit__
Methode bekommt nie eine Chance zu laufen.
Wenn Sie aufräumen möchten, verwenden Sie keinen Daemon-Thread. Verwenden Sie einen normalen Thread, und sagen Sie ihm, dass er am Ende des Hauptthreads über die normalen Inter-Thread-Kommunikationskanäle heruntergefahren werden soll.
Vielen Dank für diese schnelle Antwort. Also im Wesentlichen nach meiner Frage ist die Datei im Lesemodus offen gelassen? Eine Folgefrage - macht das die Datei unbrauchbar? –
@SamThomas: Das Betriebssystem sollte die geöffneten Dateihandles des Prozesses auf Betriebssystemebene automatisch schließen, wenn der Prozess beendet wird. Dies führt jedoch nicht zwangsläufig zu einem leeren Ausgabepuffer für Dateien, die im Schreibmodus geöffnet werden. – user2357112
Also in so einem Fall, wie oben, ist Daemon-Nutzung sicher, oder? –