これは私が扱っているもっと複雑なコードの本当に単純なバージョンです。問題は、後で表示できるリストに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.
ありがとうございます。
グローバル変数は、すべてのPythonプロセスで共有することはできません。最も簡単な解決法は、 'method'から7と8の両方を返し、その後8sをリストに集めることです。 'Pool.map'を参照してください。 –