2011-06-23 29 views
1

我有一个由对象列表组成的模拟。我想在所有这些对象上并行调用一个方法,因为它们都不依赖于另一个,使用线程池。你不能腌制的方法,所以我想用一个包装函数有副作用做类似下面的:如何在一组对象上并行调用方法?

from multiprocessing import Pool 

class subcl: 
    def __init__(self): 
     self.counter=1 
     return 
    def increment(self): 
     self.counter+=1 
     return 

def wrapper(targ): 
    targ.increment() 
    return 

class sim: 
    def __init__(self): 
     self.world=[subcl(),subcl(),subcl(),subcl()] 
    def run(self): 
     if __name__=='__main__': 
      p=Pool() 
      p.map(wrapper,self.world) 

a=sim() 
a.run() 
print a.world[1].counter #should be 2 

然而,函数调用没有在预期的副作用数组中的实际对象。有没有办法简单地使用线程池和映射来处理这个问题,还是我必须按照原始函数调用和元组/列表/字符串(或者使用多处理或其他并行库获得更详细的说明)来做所有事情?

回答

1

混淆的主要来源是multiprocessing使用单独的进程而不是线程。这意味着对子对象所做的任何更改都不会自动为父对象显示。

在你的例子来处理最简单的方法是让wrapper返回新值,然后使用Pool.map返回值:

from multiprocessing import Pool 

class subcl: 
    def __init__(self): 
     self.counter=1 
     return 
    def increment(self): 
     self.counter+=1 
     return 

def wrapper(targ): 
    targ.increment() 
    return targ          # <<<<< change #1 

class sim: 
    def __init__(self): 
     self.world=[subcl(),subcl(),subcl(),subcl()] 
    def run(self): 
     if __name__=='__main__': 
      p=Pool() 
      self.world = p.map(wrapper,self.world)  # <<<<< change #2 

a=sim() 
a.run() 
print a.world[1].counter # now prints 2 
相关问题