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

How to maintain class state when executing class methods for multiple classes in parallel?

在下面的示例中,如何在使用多处理时递增 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() 每个 class 并行使用:

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]。 class' n 属性没有改变,因为 运行ning [k.n for k in klasses] 结果是 [0, 0, 0, 0].

当方法未并行处理时,例如[k.run() for k in klasses][k.n for k in klasses] returns [1, 1, 1, 1] 符合预期。

当 运行 并行时,classes 是否有办法保持状态?

multiprocessing 中的共享状态必须显式完成,因为每个 worker 都是一个单独的进程。 multiprocessing docs cover the various options in so detail. The simplest solution would be to make n a multiprocessing.Value,尽管这需要对 Test class 进行重大更改以使其使用正确的类型和属性。

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