如何在并行执行多个类的类方法时保持类状态?

时间:2016-08-09 02:31:13

标签: class python-3.x state python-multiprocessing

在下面的示例中,如何在使用多处理时增加n

class Test:  
    def __init__(self, n):
        self.n = n

    def run(self):
        self.n += 1
        return True

# Generate 4 classes
klasses = [Test(0) for i in range(4)]

运行[k.n for k in klasses]时,会按预期生成[0, 0, 0, 0]

尝试使用以下方法并行运行每个类的函数run()

from multiprocessing import Pool    
with Pool() as pool:
    results = [pool.apply_async(k.run, ()) for k in klasses ]
    result = [i.get() for i in results]

会导致result按预期返回[True, True, True, True]。班级' n属性未发生变化,因为正在运行[k.n for k in klasses]会导致[0, 0, 0, 0]

当不平行处理该方法时,例如[k.run() for k in klasses][k.n for k in klasses]按预期返回[1, 1, 1, 1]

有没有办法让类在并行运行时保持状态?

1 个答案:

答案 0 :(得分:1)

multiprocessing中的共享状态必须明确完成,因为每个工作者都是一个单独的进程。 multiprocessing docs cover the various options in so detail.最简单的解决方案是将n设为multiprocessing.Value,但这需要对Test类进行重大更改,以使其使用正确的类型和属性。

或者,尝试使用pool.imap / pool.imap_unordered找到一种方法来执行工作,并将状态作为参数传入并返回新数据;如果您的问题可以通过这种方式表达,那么限制共享到输入和输出通常会更好,而不是实时状态。