2017-08-29 27 views
2

これは私が扱っているもっと複雑なコードの本当に単純なバージョンです。問題は、後で表示できるリストにmethod()関数で計算されたアイテムを追加したいということです。ただし、このコードを実行すると、リストオブジェクトは空になり、結果配列はいっぱいになります。並列プロセス(python)でリストに項目を追加するには?

import multiprocessing as mp 
    global list 
    list = [] 
    def add(thing): 
     list.append(thing) 
    def method(): 
     global list 
     add(8) #doesn't work as wanted 
     return 7 
    def logResult(result): 
     results.append(result) 

    if (__name__ == '__main__'): 
     results = [] 
     cpu = mp.cpu_count() 
     pool = mp.Pool(processes=cpu) 
     for x in range(0, 2000): 
      pool.apply_async(method,callback=logResult) 
     pool.close() 
     pool.join() 
     print list 
     print results 

出力:

[] 
    [7,7,7,7,7,7,7,7,7....] and so on. 

私は、addメソッドが冗長と思われることを知っている、しかし、単純なlist.append()メソッドの内部()関数はどちらか動作しません。 addメソッドは、logResultメソッド()をミラーリングするためのものです。なぜ動作しないのか分かりますが、これを修正する方法はわかりません。並列化がなければ、プログラムは必要に応じて動作しますが、並列化はプロジェクトのために必要です。計算はmethod()関数よりもずっと面倒です。希望の出力は

[8,8,8,8,8,8,8,8,8,8,8,8,...] 
    [7,7,7,7,7,7,7,7,7,7,7,7,...] and so on. 

ありがとうございます。

+1

グローバル変数は、すべてのPythonプロセスで共有することはできません。最も簡単な解決法は、 'method'から7と8の両方を返し、その後8sをリストに集めることです。 'Pool.map'を参照してください。 –

答えて

0

空欄のメソッド()にglobal listが設定されているようです。前に設定した場合はmethod()では必要ありません。

1

リストは、ワーカー・サブプロセスからアクセスできるように、共有メモリーに存在する必要があります。 multiprocessing.Manager().list()を検討してください。

0
pool.apply_async(method,callback=logResult) 
  1. あなたのメソッドの機能が不足しています()。 [... 8,8,8,8,8]

    pool.apply_async(method(),callback=logResult(7)) 
    

    GET結果を:

  2. logResultは

は、単にこれに変更(あなたのコードに応じて)に渡すために何かを持っている必要があります、[7,7,7,7,7 ...]

関連する問題