multiprocessing.Pool.map
ワーカーが次の割り当てを取得すると、ドキュメントに従って引数が選択されたオブジェクトとして渡されるという問題を理解していると思います。戻り値が探しているものであればこれで問題ありませんが、オブジェクトの状態を並行して変更する関数を呼び出したい場合はどうすればよいでしょうか? たとえば、単純なオブジェクトを考えてみましょう:
from multiprocessing import Pool
class state():
def __init__(self):
self.z = 0
def __repr__(self):
return "%s"%self.z
def compute(self):
print "Computing"
self.z += 1
そして、このオブジェクトのいくつかの操作:
def compute_function(x): x.compute()
A = [state() for _ in xrange(3)]
print A
A[2].compute()
print A
map(compute_function, A)
print A
P = Pool()
P.map(compute_function, A)
print A
出力は次のとおりです。
[0, 0, 0]
Computing
[0, 0, 1]
Computing
Computing
Computing
[1, 1, 2]
Computing
Computing
Computing
[1, 1, 2]
しかし、最後の行を読むことを期待しています[2, 2, 3]
。明らかにcompute
が呼び出されましたが、結果のオブジェクトは破棄されました。「状態を維持」するにはどうすればよいですか?