对象参数的多处理映射

时间:2012-10-03 20:20:11

标签: python multiprocessing

我有一个包含对象列表的对象。我想做点什么:

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来包含每个更新的粒子。目前,我有一个技巧可以将两个参数推入pool.map函数

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

但每个particle.weight似乎都没有更新。我做错了什么?

1 个答案:

答案 0 :(得分: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)