Was ist die richtige Lösung, um sicherzustellen, dass die Datei nie beschädigt wird, während viele Threads und Prozesse verwenden.gleichzeitige Schreiben in die gleiche Datei mit Threads und Prozesse
Version für Threads, die sich um Öffnungsfehler kümmern.
lock = threading.RLock()
with lock:
try:
f = open(file, 'a')
try:
f.write('sth')
finally:
f.close() # try close in any circumstances if open passed
except:
pass # when open failed
für Prozesse ich denke, muss multiprocessing.Lock
aber wenn ich zwei Prozesse werden soll, und der erste Prozess eigene 2 Threads (jeweils eine Verwendung Datei)
gibt es nur Theorie, sondern Ich möchte wissen, wie man Synchronisation mit Threads und Prozessen mischt. sind Threads "vererben" es von Prozess?, So dass nur Synchronisierung zwischen Prozessen erforderlich sind?
und 2. Ich bin mir nicht sicher, ob obiger Code verschachtelte try des Falles, dass, wenn das Schreibfehlschlagen, und wir wollen, schließen geöffnete Datei (was, wenn es nach Schloss geöffnet bleiben freigegeben)
Als eine Randnotiz kann (und sollte) Ihr 'try' /' finally' durch eine 'with'-Anweisung ersetzt werden. Außerdem ist 'except: pass' in der Regel eine schlechte Idee - wenn Sie versuchen, eine bestimmte Ausnahme zu verschlucken, schlucken Sie genau diese, nicht alles. Wenn du dich hier umsiehst, wirst du Dutzende von Fragen von Leuten finden, die dumme Fehler hatten, wie zum Beispiel einen int als einen Dateinamen zu übergeben, der eine bloße Ausnahme davon abhielt, sie zu bemerken und zu debuggen. – abarnert
Wenn Sie speziell für Dateien sperren, sollten Sie möglicherweise Advisory-Dateisperren für POSIX und exklusiven Dateizugriff unter Windows anstelle von generischen Thread-/Prozesssperren in Erwägung ziehen. – abarnert
Eine andere Möglichkeit besteht darin, die gesamte Datei aus einem einzelnen Thread (in einem einzigen Prozess) anzuhängen und alle anderen nur Nachrichten in eine Warteschlange zu stellen (die keine Synchronisation benötigt, weil sie eingebaut ist). – abarnert