0
私はPython multiprocessing.Pool: when to use apply, apply_async or map?を読みましたが、それは役に立ちましたが、それでも私自身の質問がありました。次のコードでは、result_list.append(result)を並列にしたいので、4つのプロセッサに結果を並列に追加し、4つのリストを1つのリストに変換します。Pythonマルチプロセッシング.Pool:並列にReasultsを結合する方法は?
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(4)
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()
4つのプロセッサーで4つのリストを作成し、後で4つのリストを1つのリストにマージする方が簡単ですか? –
それはまさに私が望んでいる、それを実装する方法ですか? – shao
私はあなたが何を求めているのか分かりません。あなたは 'pool.map'がほしいと思うように聞こえます。リストがメインプロセスのメモリ(他のプロセスと共有されていない)に存在するため、子プロセスが結果リストへの追加を行う方法はありません。余分な努力(例えば 'multiprocessing.Array')で動作するいくつかの同期型がありますが、それらを安全に使うにはかなりのオーバーヘッドが必要と思われます。 'pool.map'を使用する方がはるかに簡単で、おそらく同じシステムを自分で作成するよりも高速です。 – Blckknght