2017-02-28 5 views
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() 
+0

4つのプロセッサーで4つのリストを作成し、後で4つのリストを1つのリストにマージする方が簡単ですか? –

+0

それはまさに私が望んでいる、それを実装する方法ですか? – shao

+1

私はあなたが何を求めているのか分かりません。あなたは 'pool.map'がほしいと思うように聞こえます。リストがメインプロセスのメモリ(他のプロセスと共有されていない)に存在するため、子プロセスが結果リストへの追加を行う方法はありません。余分な努力(例えば 'multiprocessing.Array')で動作するいくつかの同期型がありますが、それらを安全に使うにはかなりのオーバーヘッドが必要と思われます。 'pool.map'を使用する方がはるかに簡単で、おそらく同じシステムを自分で作成するよりも高速です。 – Blckknght

答えて

1

Multiprocessing poolが選択されます。

以下はいくつかのサンプルコードですが、役立つことを願っています。また、別の私の答えをチェックして詳細を見ることもできます。 How can I make my python code run faster

from multiprocessing import Pool 
    import time 

    def foo_pool(x): 
     return x*x 

    def main(): 
     pool = Pool(4) 
     sampleData = [x for x in range(9)] 
     results = pool.map(foo_pool, sampleData) 
     pool.close() 
     pool.join() 
     print(results) 

    if __name__ == '__main__': 
     main() 
関連する問題