multiprocessing.Pool
はすでに共有結果キューを持っているので、を追加で含める必要はありませんManager.Queue
。Manager.Queue
あるqueue.Queue
別のサーバプロセスにあり、プロキシを介して露出し、フードの下(マルチスレッドキュー)。これにより、プールの内部キューに比べてオーバーヘッドが追加されます。Poolのネイティブの結果処理に依存するのとは逆に、の結果Manager.Queue
も順序付けされるとは限りません。
ワーカープロセスはで開始されません。.apply_async()
これは、インスタンス化しPool
たときにすでに発生しています。何され、あなたが呼び出すときに開始することはpool.apply_async()
、新たな「仕事」です。プールのワーカープロセスは、multiprocessing.pool.worker
内部で- 関数を実行します。この関数は、プールの内部Pool._inqueue
を介して転送された新しい「タスク」を処理し、を介して親に結果を送り返しPool._outqueue
ます。指定したfunc
は内で実行されますmultiprocessing.pool.worker
。何かがあるfunc
だけreturn
で、結果は自動的に親に送り返されます。
.apply_async()
即時(非同期)にAsyncResult
オブジェクト(のエイリアス)を返しますApplyResult
。.get()
実際の結果を受け取るには、そのオブジェクトを呼び出す(ブロックする)必要があります。別のオプションは、結果が準備ができるとすぐに発生するコールバック関数を登録することです。
from multiprocessing import Pool
def busy_foo(i):
"""Dummy function simulating cpu-bound work."""
for _ in range(int(10e6)): # do stuff
pass
return i
if __name__ == '__main__':
with Pool(4) as pool:
print(pool._outqueue) # DEMO
results = [pool.apply_async(busy_foo, (i,)) for i in range(10)]
# `.apply_async()` immediately returns AsyncResult (ApplyResult) object
print(results[0]) # DEMO
results = [res.get() for res in results]
print(f'result: {results}')
出力例:
<multiprocessing.queues.SimpleQueue object at 0x7fa124fd67f0>
<multiprocessing.pool.ApplyResult object at 0x7fa12586da20>
result: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
注:timeout
-parameterを指定しても.get()
、ワーカー内のタスクの実際の処理は停止せず、を発生させて待機中の親のブロックを解除するだけmultiprocessing.TimeoutError
です。