python 3.当并行执行多个类的类方法时,如何维护类状态



在下面的示例中,如何在使用多处理时增加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]

是否有一种方法,为类保持状态时,并行运行虽然?

multiprocessing中的共享状态必须显式完成,因为每个worker都是一个单独的进程。multiprocessing文档详细介绍了各种选项。最简单的解决方案是使n成为multiprocessing.Value,尽管这需要对Test类进行重大更改以使其使用正确的类型和属性。

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

最新更新