Ich habe Probleme mit dem Multiprocessing-Modul. Ich verwende einen Pool von Arbeitern mit seiner Kartenmethode, um Daten aus vielen Dateien zu laden, und für jeden von ihnen analysiere ich Daten mit einer benutzerdefinierten Funktion. Jedes Mal, wenn eine Datei verarbeitet wurde, möchte ich einen Zähler aktualisieren lassen, damit ich nachvollziehen kann, wie viele Dateien noch verarbeitet werden müssen. Hier ist Beispielcode:Python Multiprocessing und ein gemeinsamer Zähler
def analyze_data(args):
# do something
counter += 1
print counter
if __name__ == '__main__':
list_of_files = os.listdir(some_directory)
global counter
counter = 0
p = Pool()
p.map(analyze_data, list_of_files)
ich keine Lösung für diese finden können.
Große Antwort! Ich hatte das gleiche Problem in IronPython, und während multiprocessing.Value nicht verfügbar ist, können Sie etwas ähnliches mit clr.Reference und System.Threading.Interlocked tun: http://StackOverflow.com/Questions/2255461/how-to-atomical- increment-a-static-Mitglied-in-ironpython/2314858 # 2314858 –
@jkp, wie würdest du es ohne die globale Variable tun? - Ich versuche eine Klasse zu benutzen, aber es ist nicht so einfach wie es scheint. Siehe http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemeth-when-pythons-multiprocessing-pool-ma – Anna
Leider scheint dieses Beispiel fehlerhaft zu sein, da 'counter.value + = 1 'ist nicht atomar zwischen Prozessen, so wird der Wert falsch sein, wenn er lange genug mit ein paar Prozessen läuft –