0

Wenn ich den folgenden Code in einem Daemon-Thread habe und der Haupt-Thread keinen Join auf dem Daemon aufruft. Wird die Datei sicher geschlossen, da sie innerhalb von "mit" verwendet wird, sobald der Hauptthread beendet ist oder nicht? Wie auch immer, um es sicher zu machen? Danke: DPython-Daemon-Threads und die "with" -Anweisung

while True: 
    with open('file.txt', 'r') as f: 
     cfg = f.readlines() 
time.sleep(60) 

Antwort

2

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.

+0

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

+0

@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

+0

Also in so einem Fall, wie oben, ist Daemon-Nutzung sicher, oder? –

Verwandte Themen