我有一个类实例列表。每个类对象都有一个我想要运行的方法函数,我希望在类实例之间进行并行化,因为它们中有很多。例如,我有这个类对象:
class Person(object):
def __init__(self, name):
self.name = name
def register(self):
self.registered = True
现在我定义了Person()
persons = [Person(i) for i in ["Bernard", "Enrik", "Joseph"]]
我希望在人员的值中并行化Person.register()
方法函数的运行。使用multiprocessing.Pool,这就是我所做的。由于你不能腌制方法函数,我将它包装在另一个函数中。
import multiprocessing as mp
def reg(person):
person.register()
pool = mp.Pool(processes=mp.cpu_count()//2)
res = list(pool.map(reg, persons))
顺便说一下,代码运行时没有错误,所以现在我希望列表中的每个Person实例都将属性registered
设置为True
但是当我检查每个类实例时,它不会#39; t包含属性registered
。例如,检查registered
是否为person [0],
hasattr(persons[0], "registered")
>>> False
为什么会这样?我该如何解决这个问题?
答案 0 :(得分:1)
我在这里发现了类似的问题:Python multiprocessing with pathos。 Person类实例没有属性registered
的原因在于,在多处理中,Pool创建的进程只是列表中类实例的副本,因此,在包装函数中解决这个问题reg()
返回类实例,即
def reg(person):
person.register()
return person
pool = mp.Pool(processes=mp.cpu_count()//2)
persons = list(pool.map(reg, persons))