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