0

オブジェクトのリストを含むオブジェクトがあります。私は次のようなことをしたいと思います:

def compute_weight(particle, data):
    particle.weight = run_computation(data)

class SomeClass:
    def __init__(self):
        self.particles = [obj1, obj2, etc]

    def run(self, data):
        [compute_weight(particle, data) for p in self.particles]

これらは独立して実行できますが、更新された各パーティクルを含めるには self.particles が必要です。現在、2つの引数をpool.map関数に押し込むトリックがあります

            # equivalent function as above
            pool.map(compute_weight_star, itertools.izip(self.particles,
                                                         itertools.repeat(data)))

しかし、各particle.weightは更新されていないようです。私は何を間違っていますか?

4

1 に答える 1

0

問題は、パーティクル オブジェクトがワーカー プロセスで更新されても、マスター プロセスに戻されることです。次の簡単な例を考えてみましょう。

from multiprocessing import Pool

particles = [[0], [0], [0]]

def compute_weight(particle):
    particle[0] = 1

if __name__ == '__main__':
    Pool().map(compute_weight, particles)
    print(particles)

これにより、パーティクルの重み (リストの最初の要素) が 0 のままになっていることがわかりますが、1 である必要があります。

解決策は、ワーカー プロセスでパーティクルの重みを計算することですが、ストレージ部分はマスター プロセスで行います。

def compute_weight(particle):
    return 1

if __name__ == '__main__':
    w = Pool().map(compute_weight, particles)
    for i, p in enumerate(particles):
        p[0] = w[i]     # set weight
    print(particles)
于 2012-10-03T20:28:19.220 に答える