multiprocesamiento.Pool ejemplo

Estoy tratando de aprender a usar el multiprocesamiento y encontré el siguiente ejemplo .

Quiero sumr los valores de la siguiente manera:

from multiprocessing import Pool from time import time N = 10 K = 50 w = 0 def CostlyFunction(z): r = 0 for k in xrange(1, K+2): r += z ** (1 / k**1.5) print r w += r return r currtime = time() po = Pool() for i in xrange(N): po.apply_async(CostlyFunction,(i,)) po.close() po.join() print w print '2: parallel: time elapsed:', time() - currtime 

No puedo obtener la sum de todos los valores de r

Si va a usar apply_async de esa manera, entonces tiene que usar algún tipo de memoria compartida. Además, debe colocar la parte que inicia el multiprocesamiento para que solo se realice cuando la secuencia de comandos inicial lo llame, no los procesos agrupados. Aquí hay una forma de hacerlo con mapa.

 from multiprocessing import Pool from time import time K = 50 def CostlyFunction((z,)): r = 0 for k in xrange(1, K+2): r += z ** (1 / k**1.5) return r if __name__ == "__main__": currtime = time() N = 10 po = Pool() res = po.map_async(CostlyFunction,((i,) for i in xrange(N))) w = sum(res.get()) print w print '2: parallel: time elapsed:', time() - currtime 

Aquí está el ejemplo más simple que encontré en la documentación de ejemplo de python :

 from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': pool = Pool(processes=4) # start 4 worker processes result = pool.apply_async(f, [10]) # evaluate "f(10)" asynchronously print result.get(timeout=1) # prints "100" unless your computer is *very* slow print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]" 

Era bastante simple, incluso yo podía entenderlo.
Nota result.get() es lo que desencadena el cálculo.