2011-08-07 10 views
10

マルチプロセスワーカープールのほとんどの例は、異なるプロセスで単一の機能を実行します。異なる機能を持つマルチプロセスプール

def foo(args): 
    pass 

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

プール内に2つの異なる独立した機能を処理する方法はありますか?あなたがf.eを割り当てることができるように。 foo()のための15のプロセスとbar()のための15のプロセスか、あるいは単一の関数に束縛されたプールですか?または、異なる機能を手動で異なるプロセスで作成する必要があります。

p = Process(target=foo, args=(whatever,)) 
q = Process(target=bar, args=(whatever,)) 
q.start() 
p.start() 

ワーカープールについては忘れてしまいますか?

答えて

14

異なる機能を渡すには、map_asyncを複数回呼び出すだけです。ここ

があることを示すために、一例であり、

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)) 

結果は次のようになります

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

を、それらが「行の」並列実行したりするのだろうか? – dorvak

+2

'map_async'はすぐに戻ります。プールに十分な空きプロセスがあれば、待たずに新しいタスクが実行されます。上記の例では、それらは並行して実行されます。 @mad_scientist –

+1

Thx!しかし、特定の量のワーカー/プロセスを割り当てる方法はありません。 – dorvak

1

それらは並列にない実行されます。 コード下記参照:

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() 

上記のコードは次の印刷物が得られる:

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 
関連する問題