在下面的示例中,如何在使用多处理时增加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
与状态传递作为参数和新数据返回;如果您的问题可以这样表达,那么最好将共享限制在输入和输出,而不是实时状态。