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:
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%Sie sollten wirklich zwei Warteschlangen und drei verschiedene Verarbeitungsarten verwenden.
Platziere die Sachen in die Warteschlange # 1.
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.
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.
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%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.
Tags und Links python queue file-io multiprocessing