Alternatywne wzorce użycia dla multiprocessingu Pythona unikające proliferacji globalnego stanu?
Ten (bardzo uproszczony przykład) działa dobrze (Python 2.6.6, Debian Squeeze):
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()
jednak po latach naukiglobalny stan zły !!!, wszystkie moje instynkty mówią mi, że naprawdę wolałbym raczej napisać coś bliższego:
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()
ale oczywiście to nie działa (odkłada słuchawkę, nie mogąc czegoś wyblaknąć).
Przykład tutaj jest trywialny, ale do czasu dodania wielu funkcji „procesowych”, a każda z nich jest zależna od wielu dodatkowych danych wejściowych ... wszystko to przypomina nieco coś napisanego w BASIC 30 lat temu. Próba użycia klas do przynajmniej agregacji stanu z odpowiednimi funkcjami wydaje się oczywistym rozwiązaniem, alenie wydaje się takie łatwe w praktyce.
Czy istnieje jakiś zalecany wzorzec lub styl do używania multiprocessing.pool, który pozwoli uniknąć rozprzestrzeniania się globalnego stanu w celu obsługi każdej funkcji, którą chcę odwzorować równolegle?
Jak radzą sobie z tym doświadczeni „profesjonaliści od przetwarzania wieloprocesowego”?
Aktualizacja: Zauważ, że jestem zainteresowany przetwarzaniem znacznie większych tablic, więc wariacje na powyższym, które są marynowanesrc
każde wywołanie / iteracja nie są prawie tak dobre jak te, które rozwidlają je w procesach roboczych puli.