Schreiben in eine Datei mit Multiprocessing

8

Ich habe das folgende Problem in Python.

Ich muss parallel einige Berechnungen durchführen, deren Ergebnisse ich nacheinander in einer Datei schreiben muss. Also habe ich eine Funktion erstellt, die ein multiprocessing.Queue und ein Datei-Handle erhält, die Berechnung durchführt und das Ergebnis in der Datei ausgibt:

%Vor%

Nach dem Ausführen des Skripts ist die Datei jedoch leer. Ich habe versucht, die worker () -Funktion zu ändern:

%Vor%

und übergeben Sie den Dateinamen als Parameter. Dann funktioniert es wie ich es vorhabe. Wenn ich versuche, dasselbe ohne Multiprocessing sequentiell zu machen, funktioniert es auch normal.

Warum hat es in der ersten Version nicht funktioniert? Ich kann das Problem nicht sehen.

Auch: Kann ich garantieren, dass zwei Prozesse nicht versuchen, die Datei gleichzeitig zu schreiben?

BEARBEITEN:

Danke. Ich hab es jetzt. Dies ist die Arbeitsversion:

%Vor%     
Rafael S. Calsaverini 29.06.2011, 17:12
quelle

3 Antworten

16

Sie sollten wirklich zwei Warteschlangen und drei verschiedene Verarbeitungsarten verwenden.

  1. Platziere die Sachen in die Warteschlange # 1.

  2. Bekommen Sie Sachen aus Queue # 1 und führen Sie Berechnungen durch, indem Sie Zeug in die Queue # 2 legen. Sie können viele davon haben, da sie aus einer Warteschlange kommen und sicher in eine andere Warteschlange gestellt werden.

  3. Bekommen Sie Sachen aus der Queue # 2 und schreiben Sie sie in eine Datei. Sie müssen genau 1 von diesen haben und nicht mehr. Es "besitzt" die Datei, garantiert atomaren Zugriff und stellt absolut sicher, dass die Datei sauber und konsistent geschrieben wird.

S.Lott 29.06.2011, 17:18
quelle
4

Wenn jemand nach einer einfachen Möglichkeit sucht, dasselbe zu tun, kann Ihnen das helfen. Ich denke nicht, dass es Nachteile hat, dies auf diese Weise zu tun. Wenn ja, lass es mich wissen.

%Vor%

Quelle: Python: Schreiben zu einer einzigen Datei mit Warteschlange bei der Verwendung von Multiprocessing-Pool

    
Menezes Sousa 15.04.2015 02:28
quelle
0

Es gibt einen Fehler im Write-Worker-Code. Wenn der Block falsch ist, erhält der Worker niemals Daten. Sollte wie folgt sein:

%Vor%

Sie können es überprüfen, indem Sie Zeile

hinzufügen %Vor%

nach dem queueOut.put((par,res))

Mit block = False erhalten Sie eine immer größere Länge der Warteschlange, bis sie voll ist, im Gegensatz zu block = True, wo Sie immer "1" erhalten.

    
Jiri Hradec 27.02.2017 20:44
quelle