我正在努力了解Pool()
和Manager()
如何在Python的多处理库中组合,以便在各个工作进程之间共享对象。在我的示例中,我希望有一个共享列表input_list
,它应该对所有工作进程都是可访问的:
from multiprocessing import Pool, Manager
def f(x):
input_list.append(x)
return x**2
if __name__ == '__main__':
manager = Manager()
input_list = manager.list()
with Pool(processes=3) as pool:
results = pool.map(f, range(10))
print(input_list)
但是,我得到了NameError: name 'input_list' is not defined
。知道为什么input_list
没有被识别为共享对象吗?
我找到了一个使用functools
的解决方案。共享列表需要作为一个附加参数传递给worker函数:
from multiprocessing import Pool, Manager
import functools
def f(x, input_list):
input_list.append(x)
return x**2
if __name__ == '__main__':
manager = Manager()
input_list = manager.list()
with Pool(processes=3) as pool:
results = pool.map(functools.partial(f, input_list=input_list), range(10))
print(input_list)
一个示例输出是:
[0, 3, 1, 4, 2, 5, 6, 7, 8, 9]