Ich versuche, eine Funktion für mehrere Prozesse aufzurufen. Die offensichtliche Lösung ist Pythons multiprocessing
Modul. Das Problem ist, dass die Funktion Nebenwirkungen hat. Es erstellt eine temporäre Datei und registriert die zu löschende Datei beim Beenden unter Verwendung der atexit.register
und einer globalen Liste. Das Folgende sollte das Problem demonstrieren (in einem anderen Kontext).Python parallel Karte (multiprocessing.Pool.map) mit globalen Daten
import multiprocessing as multi
glob_data=[]
def func(a):
glob_data.append(a)
map(func,range(10))
print glob_data #[0,1,2,3,4 ... , 9] Good.
p=multi.Pool(processes=8)
p.map(func,range(80))
print glob_data #[0,1,2,3,4, ... , 9] Bad, glob_data wasn't updated.
Gibt es eine Möglichkeit, die globalen Daten aktualisiert zu haben?
Hinweis: Wenn Sie das obige Skript ausprobieren, sollten Sie es wahrscheinlich nicht über den interaktiven Interpreter ausprobieren, da multiprocessing
erfordert, dass das Modul __main__
von untergeordneten Prozessen importiert werden kann.
UPDATE
Added die global
Schlüsselwort in func hilft nicht - zB:
def func(a): #Still doesn't work.
global glob_data
glob_data.append(a)
Prost, das funktioniert perfekt für mich. Ich sollte hier erwähnen, dass es funktioniert, weil die Objekte, die ich an glob_data anhänge, unveränderlich sind (in dem Beispiel sind es in der tatsächlichen Anwendung Strings). Wenn Objekte, die in die Liste gepackt werden, änderbar sind, muss darauf geachtet werden, dass sie erneut zur Liste hinzugefügt werden, wenn sie geändert werden. – mgilson
zu Ihren Diensten :) –
@RafaelFerreira Funktioniert gut! aber die Ergebnisse sind nicht konsistent, wie in meinem Fall .. bin mit manager.dict(), Werte ändern sich jedes Mal, wenn ich meinen Code ausführen. Ich sehe, dass die Sperre angewendet werden sollte, aber nicht sicher. –