我有一个包含对象列表的对象。我想做点什么:
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似乎都没有更新。我做错了什么?
答案 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)