web-dev-qa-db-fra.com

Exemple de multiprocessing.Pool

J'essaie d'apprendre à utiliser multiprocessing , et j'ai trouvé l'exemple suivant .

Je veux additionner les valeurs comme suit:

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

Je ne peux pas obtenir la somme de toutes les valeurs r.

25
litd

Si vous allez utiliser apply_async comme ça, alors vous devez utiliser une sorte de mémoire partagée. De plus, vous devez placer la partie qui démarre le multitraitement afin qu'elle ne soit effectuée que lorsqu'elle est appelée par le script initial, et non par les processus regroupés. Voici un moyen de le faire avec la carte.

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
19
Justin Peel

Voici l'exemple le plus simple que j'ai trouvé dans la documentation d'exemple 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]"

C'était assez simple même si je pouvais le comprendre.
Remarque result.get() est ce qui déclenche le calcul.

7
GuySoft