2012-10-03 31 views
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包含每個更新的顆粒。目前,我有一招推兩個參數到pool.map功能

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

但每個particle.weight似乎並沒有被更新。我究竟做錯了什麼?

回答

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)