2010-12-10 14 views
25

Estoy tratando de aprender a usar multiprocessing, y encontré the following example.multiprocesamiento.Pool ejemplo

Quiero sumar 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 suma de todos los valores de r.

Respuesta

18

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 lo solicite el script inicial, no los procesos agrupados. Aquí hay una manera de hacerlo con el 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 
+5

Si usa 'pool.imap' o' pool.imap_unordered', puede poner en la suma directamente, así: 'sum (pool.imap_unordered (CostlyFunction, ((i)) for i in xrange (N)).)) '. –

6

Aquí es el ejemplo más simple que he encontrado en la python example documentation:

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]" 

Ya era bastante simple, incluso pude entenderlo.
Nota result.get() es lo que desencadena el cálculo.