2010-12-10 8 views
25

Ich versuche zu lernen, wie man multiprocessing verwendet, und gefunden the following example.multiprocessing.Pool Beispiel

Ich möchte Werte summieren wie folgt:

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 

Ich kann nicht die Summe aller r-Werte erhalten.

Antwort

18

Wenn Sie apply_async so verwenden möchten, müssen Sie eine Art von gemeinsam genutztem Speicher verwenden. Außerdem müssen Sie den Teil einfügen, der den Multiprozess startet, so dass er nur ausgeführt wird, wenn er vom anfänglichen Skript aufgerufen wird, nicht von den gepoolten Prozessen. Hier ist eine Möglichkeit, dies mit der Karte zu tun.

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

Wenn Sie 'pool.imap' oder' pool.imap_unordered' verwenden, können Sie direkt in die Summe einfügen: 'sum (pool.imap_undeured (CostlyFunction, ((i,) für i in xrange (N)))) '. –

6

Hier ist das einfachste Beispiel, das ich in den python example documentation gefunden:

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

Es war einfach genug, um selbst konnte ich es verstehen.
Hinweis result.get() ist, was die Berechnung auslöst.

Verwandte Themen