Alternative Verwendungsmuster für die Python-Multiprozessierung, um die Verbreitung des globalen Zustands zu vermeiden?

Dieses (enorm vereinfachte Beispiel) funktioniert gut (Python 2.6.6, Debian Squeeze):

<code>from multiprocessing import Pool
import numpy as np

src=None

def process(row):
    return np.sum(src[row])

def main():
    global src
    src=np.ones((100,100))

    pool=Pool(processes=16)
    rows=pool.map(process,range(100))
    print rows

if __name__ == "__main__":
    main()
</code>

jedoch nach Jahren des Unterrichtsglobaler Zustand schlecht !!!Alle meine Instinkte sagen mir, dass ich wirklich lieber etwas näher schreiben würde:

<code>from multiprocessing import Pool
import numpy as np

def main():
    src=np.ones((100,100))

    def process(row):
        return np.sum(src[row])

    pool=Pool(processes=16)
    rows=pool.map(process,range(100))
    print rows

if __name__ == "__main__":
    main()
</code>

aber das funktioniert natürlich nicht (hängt nicht in der Lage, etwas zu beizen).

Das hier gezeigte Beispiel ist trivial, aber wenn Sie mehrere "Prozess" -Funktionen hinzufügen, hängt jede von mehreren zusätzlichen Eingaben ab ... nun, all dies erinnert ein wenig an etwas, das vor 30 Jahren in BASIC geschrieben wurde. Der Versuch, Klassen zu verwenden, um zumindest den Zustand mit den entsprechenden Funktionen zu aggregieren, scheint eine naheliegende Lösung zu seinscheint nicht so einfach zu sein in der Praxis.

Gibt es ein empfohlenes Muster oder einen empfohlenen Stil für die Verwendung von multiprocessing.pool, mit dem die Verbreitung des globalen Status vermieden wird, um jede Funktion zu unterstützen, über die ich eine parallele Zuordnung durchführen möchte?

Wie gehen erfahrene "Multiprocessing-Profis" damit um?

Aktualisieren: Beachten Sie, dass ich tatsächlich daran interessiert bin, viel größere Arrays zu verarbeitensrc Jeder Aufruf / jede Iteration ist bei weitem nicht so gut wie diejenigen, die ihn in die Worker-Prozesse des Pools einbringen.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage