将类实例列表传递给multiprocessing.Pool并并行化每个类对象的方法函数的运行

时间:2017-10-26 12:41:09

标签: python multiprocessing

我有一个类实例列表。每个类对象都有一个我想要运行的方法函数,我希望在类实例之间进行并行化,因为它们中有很多。例如,我有这个类对象:

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

为什么会这样?我该如何解决这个问题?

1 个答案:

答案 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))