在下面的示例中,如何在使用多处理时增加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]
。
有没有办法让类在并行运行时保持状态?
答案 0 :(得分:1)
multiprocessing
中的共享状态必须明确完成,因为每个工作者都是一个单独的进程。 multiprocessing
docs cover the various options in so detail.最简单的解决方案是将n
设为multiprocessing.Value
,但这需要对Test
类进行重大更改,以使其使用正确的类型和属性。
或者,尝试使用pool.imap
/ pool.imap_unordered
找到一种方法来执行工作,并将状态作为参数传入并返回新数据;如果您的问题可以通过这种方式表达,那么限制共享到输入和输出通常会更好,而不是实时状态。