2017-05-03 10 views
2

プロセスプールがタスクの実行を完了したことを知る方法はありますか?完了したタスクの非ブロック検出マルチブロックプール

_process_pool = mp.Pool(processes=num_workers) 
私はバッチによってプールにタスクを追加してい

for batch in gen_batches(): 
    _process_pool.map_async(fn, batch) 

すべてのタスクが行われている時に知る方法はありますか? callbackはここでは機能しません。そして、私は_process_pool.join()

+1

プールは他のマルチプロセッシング方法に比べて非常に制限されています。私は "マルチプロセスインポートプロセス、パイプ"からチェックアウトします。ワーカーを作成することができます(プロセス)。それらが完了すると、Pipe経由でメインスレッドにメッセージを渡すことができます。このルートに行く場合は、 "daemon = True"に関するものを必ず読んでください。これは孤児の孤児を防ぐでしょう。 https://docs.python.org/2/library/multiprocessing.html#pipes-and-queuesとhttps://docs.python.org/2/library/multiprocessing.html#multiprocessing.Process.daemon – 16num

+0

私はできます値とロックを使用してください。グローバル値を使用し、プロセッサフ​​ァンクションに渡す代わりにロックを使用することの欠点はありますか? グローバル変数でも正しく動作します。私はここに何かを逃していますか – vin

答えて

2

質問を呼び出すことによって、親プロセスをブロックするために避けたい:すべてのタスクが行われている時に知る方法はありますか?例えばlistからpool.map_async(...から

追加すべてAsyncResult、:パイソンでテストmultiprocessing.pool.AsyncResult

:3.4

multiple_results = [] 
for batch in gen_batches(): 
    multiple_results.append(_process_pool.map_async(fn, batch)) 


if all([ar.ready() for ar in multiple_results]): 
    print('Pool done') 
else: 
    print('Pool any alive') 

のPython 3.6.1ドキュメント» .2

+1

ありがとう!これはPython 2.7でも動作します。 – vin

関連する問題