Gleichzeitiges Schreiben in die gleiche Datei mithilfe von Threads und Prozessen

8

Was ist die richtige Lösung, um sicherzustellen, dass die Datei bei der Verwendung vieler Threads und Prozesse niemals beschädigt wird?

Version für Threads, die sich um das Öffnen von Fehlern kümmern.

%Vor%

für Prozesse muss ich multiprocessing.Lock

verwenden

aber wenn ich 2 Prozesse haben möchte und der erste Prozess 2 Threads besitzt (jede benutzt eine Datei)

Es gibt nur Theorie, aber ich möchte wissen, wie man Synchronisation mit Threads und Prozessen mischt. Sind Threads "erben" von Prozess?, so dass nur Synchronisation zwischen Prozessen erforderlich ist?

und 2. Ich bin mir nicht sicher, ob der obige Code verschachtelt werden muss, falls der Schreibvorgang fehlschlägt, und wir wollen die geöffnete Datei schließen (was passiert, wenn sie nach der Freigabe der Sperre geöffnet bleibt)

    
Sławomir Lenart 23.08.2013, 22:23
quelle

1 Antwort

7

Obwohl dies nicht ganz klar aus den Dokumenten ist, machen Multiprocessing-Synchronisations-Primitive dies möglich Tatsächlich synchronisieren Sie auch Threads.

Wenn Sie beispielsweise diesen Code ausführen:

%Vor%

... die Ausgabe wird immer 1111111111222222222 oder 22222222221111111111 sein, keine Mischung aus beidem.

Die Sperren werden auf Win32-Kernel-Sync-Objekten unter Windows, Semaphoren auf POSIX-Plattformen, die sie unterstützen, implementiert und auf anderen Plattformen überhaupt nicht implementiert. (Sie können dies mit import multiprocessing.semaphore testen, was eine ImportError auf anderen Plattformen auslöst, wie in den Dokumenten erklärt.)

Abgesehen davon ist es sicher sicher , zwei Sperrstufen zu haben, solange Sie sie immer in der richtigen Reihenfolge verwenden - dh, nehmen Sie niemals threading.Lock , es sei denn, Sie können das garantieren Ihr Prozess hat multiprocessing.Lock .

Wenn Sie dies clever genug tun, kann es Leistungsvorteile haben. (Prozessübergreifende Sperren unter Windows und einigen POSIX-Plattformen können um Größenordnungen langsamer sein als Intraprozess-Sperren.)

Wenn Sie es nur auf die naheliegende Art machen (nur with threadlock: in% with processlock: Blöcke), wird es offensichtlich der Performance nicht helfen, und tatsächlich wird es die Dinge ein wenig verlangsamen (obwohl möglicherweise nicht genug zum Messen) ), und es wird keine direkten Vorteile hinzufügen. Natürlich wissen Ihre Leser, dass Ihr Code korrekt ist, auch wenn sie nicht wissen, dass multiprocessing locks zwischen Threads funktioniert, und in manchen Fällen kann das Debugging von Prozess-Deadlocks viel einfacher sein als das Debugging von Interprozess-Deadlocks ... aber ich denke nicht beides ist in den meisten Fällen ein guter Grund für die zusätzliche Komplexität.

    
abarnert 23.08.2013, 22:31
quelle