如何在multiprocessing Pool中通过传入参数获取执行后的返回值?
问题原因
多进程模式下,每个子进程会独立复制主进程的内存空间,你在子进程中修改的new_numbers是子进程本地的副本,改动不会同步回主进程,因此主进程最终打印的还是最初初始化的空列表。
解决方法
方法1:使用map的返回值(推荐)
Pool.map本身会自动收集所有子进程函数调用的返回值,拼装成列表返回,不需要额外维护共享变量,逻辑最简单性能也最高。
修改后的代码如下:
from multiprocessing import Pool numbers = list(range(100)) def add_one(number): return number + 1 if __name__ == '__main__': process_pool = Pool(2) new_numbers = process_pool.map(add_one, numbers) process_pool.close() process_pool.join() print(new_numbers)
注意必须加
if __name__ == '__main__'保护入口逻辑,避免Windows系统下多进程启动报错。
方法2:使用进程间共享数据结构
如果确实需要跨进程修改同一个列表,可以用multiprocessing.Manager提供的同步容器,改动会自动在进程间同步:
from multiprocessing import Pool, Manager from functools import partial numbers = list(range(100)) def add_one(number, new_numbers): new = number + 1 new_numbers.append(new) if __name__ == '__main__': with Manager() as manager: # 创建进程间共享的列表 new_numbers = manager.list() process_pool = Pool(2) add_one_helper = partial(add_one, new_numbers=new_numbers) process_pool.map(add_one_helper, numbers) process_pool.close() process_pool.join() # 可转为普通列表使用 print(list(new_numbers))
共享容器会有额外的锁开销,仅适合必须共享状态的场景使用。
内容的提问来源于stack exchange,提问作者marlon
相关产品推荐
相关产品推荐

