2011-12-16 15 views

答えて

275

戻る、任意の引数を持つ関数を呼び出すために、あなたはapply使用します。

apply(f,args,kwargs) 

applyまだいえないのpython3でPython2.7に存在し、一般的にはもう使用されていません。現在、

f(*args,**kwargs) 

が好ましい。 multiprocessing.Poolモジュールは同様のインターフェイスを提供しようとします。

Pool.applyは、Python applyと似ていますが、機能コールは別のプロセスで実行されます。機能が完了するまでブロックPool.applyをブロックします。

Pool.apply_asyncもPythonの組み込みのapplyに似ていますが、結果を待たずにすぐに呼び出しを返す点が異なります。 ApplyResultオブジェクトが返されます。 get()メソッドを呼び出して、関数呼び出しの結果を取得します。 get()メソッドは、機能が完了するまでブロックします。したがって、pool.apply(func, args, kwargs)pool.apply_async(func, args, kwargs).get()に相当します。

Pool.applyとは対照的に、Pool.apply_asyncメソッドには、関数が完了したときに呼び出されるコールバックもあります。これはget()を呼び出す代わりに使用できます。例えば

import multiprocessing as mp 
import time 

def foo_pool(x): 
    time.sleep(2) 
    return x*x 

result_list = [] 
def log_result(result): 
    # This is called whenever foo_pool(i) returns a result. 
    # result_list is modified only by the main process, not the pool workers. 
    result_list.append(result) 

def apply_async_with_callback(): 
    pool = mp.Pool() 
    for i in range(10): 
     pool.apply_async(foo_pool, args = (i,), callback = log_result) 
    pool.close() 
    pool.join() 
    print(result_list) 

if __name__ == '__main__': 
    apply_async_with_callback() 

pool.mapとは異なり、結果の順序はpool.apply_async呼び出しが行われた順序に対応しないことがあり、そのような

[1, 0, 4, 9, 25, 16, 49, 36, 81, 64] 

注意として結果をもたらすことができます。あなたが別のプロセスで関数を実行する必要がありますが、その関数が戻るまでブロックに現在のプロセスをしたい場合


ので、Pool.applyを使用しています。 Pool.applyのように、Pool.mapは、完全な結果が返されるまでブロックします。

ワーカープロセスのプールで多数の関数呼び出しを非同期に実行する場合は、Pool.apply_asyncを使用します。結果のの注文は、Pool.apply_asyncへの呼び出しの順序と同じであることが保証されていません。

と異なるの機能をPool.apply_asyncと呼ぶこともできます(すべての呼び出しで同じ機能を使用する必要はありません)。

対照的に、Pool.mapは、同じ機能を多くの引数に適用します。 しかし、Pool.apply_asyncとは異なり、結果は引数の順序に対応する順序で返されます。mapapplyについて

+6

Windows上で 'apply_async_with_callback()'の前に 'if __name __ ==" __ main __ "'があるべきですか? – jfs

+1

はい、ありがとうございます。 – unutbu

+1

ありがとうございました。 map_asyncはどうですか? –

47

pool.apply(f, args)fはプールだけの労働者のいずれかで実行されます。したがって、プール内の1つのプロセスがf(args)を実行します。

pool.map(f, iterable):このメソッドは、iterableをいくつかのチャンクに分割し、プロセスプールに別々のタスクとしてサブミットします。したがって、プール内のすべてのプロセスを利用できます。

+0

iterableがジェネレータの場合はどうすればいいですか –

+0

うーん...良い質問です。正直言って私は発電機でプールを使用したことはありませんが、このスレッドは参考になるかもしれません:https://stackoverflow.com/questions/5318936/python-multiprocessing-pool-lazy-iteration – kakhkAtion

+0

@kakhkAtion適用については、残りの労働者は何をしていますか?他の従業員にタスクを実行させるために複数回適用を呼び出す必要がありますか? – Moondra

関連する問題