2011-08-07 12 views
10

Większość przykładów puli roboczej wieloprocesowej wykonuje jedną funkcję w różnych procesach, f.e.Pule Mulitprocess z różnymi funkcjami

def foo(args): 
    pass 

if __name__ == '__main__': 
    pool = multiprocessing.Pool(processes=30) 
    res=pool.map_async(foo,args) 

Czy istnieje sposób na obsługę dwóch różnych i niezależnych funkcji w puli? Abyś mógł przydzielić f.e. 15 procesów dla foo() i 15 procesów dla bar() lub jest pulą ograniczoną do pojedynczej funkcji? A może musisz utworzyć różne procesy dla różnych funkcji ręcznie przy użyciu jednej z nich, aby zapomnieć o puli pracowników? Nie.

Odpowiedz

14

Aby przekazać różne funkcje, wystarczy kilka razy wywołać map_async.

Oto przykład dla zilustrowania, że ​​

from multiprocessing import Pool 
from time import sleep 

def square(x): 
    return x * x 

def cube(y): 
    return y * y * y 

pool = Pool(processes=20) 

result_squares = pool.map_async(f, range(10)) 
result_cubes = pool.map_async(g, range(10)) 

Wynik będzie:

>>> print result_squares.get(timeout=1) 
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] 

>>> print result_cubes.get(timeout=1) 
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729] 
+0

i będą wykonywane równolegle lub „w wierszu”? – dorvak

+2

Funkcja 'map_async' natychmiast zwraca. Dopóki w puli jest wystarczająco dużo wolnych procesów, nowe zadania będą uruchamiane bez czekania. W powyższym przykładzie będą działać równolegle. @mad_scientist –

+1

Thx! Ale nie ma sposobu na przypisanie określonej ilości pracowników/procesów, tak myślę? – dorvak

1

Będą nie prowadzony równolegle. Zobacz następujący kod:

def updater1(q,i):  
    print "UPDATER 1:", i 
    return 

def updater2(q,i):  
    print "UPDATER2:", i 
    return 

if __name__=='__main__': 
    a = range(10) 
    b=["abc","def","ghi","jkl","mno","pqr","vas","dqfq","grea","qfwqa","qwfsa","qdqs"] 


    pool = multiprocessing.Pool() 

    func1 = partial(updater1,q) 
    func2 = partial(updater2,q) 
    pool.map_async(func1, a) 
    pool.map_async(func2, b) 

    pool.close() 
    pool.join() 

Powyższy kod daje następujący wydruk:

UPDATER 1: 1 
UPDATER 1: 0 
UPDATER 1: 2 
UPDATER 1: 3 
UPDATER 1: 4 
UPDATER 1: 5 
UPDATER 1: 6 
UPDATER 1: 7 
UPDATER 1: 8 
UPDATER 1: 9 
UPDATER2: abc 
UPDATER2: def 
UPDATER2: ghi 
UPDATER2: jkl 
UPDATER2: mno 
UPDATER2: pqr 
UPDATER2: vas 
UPDATER2: dqfq 
UPDATER2: grea 
UPDATER2: qfwqa 
UPDATER2: qwfsa 
UPDATER2: qdqs 
Powiązane problemy