Python多进程:如何用Pool运行两个函数并更新全局集合?
问题解决:Python多进程中无法更新全局集合的问题
你的代码核心问题在于:Python多进程(multiprocessing.Pool)中,每个子进程会复制父进程的内存空间,你在squared和cubed里修改的res1、res2都是子进程自己的副本,父进程里的原集合完全没被改动,所以最终打印结果为空。
以下是两种可行的实现方案:
方案一:任务函数返回结果,主进程合并
这是最直观高效的方式,让子进程返回计算结果,主进程统一将结果合并到集合中:
import multiprocessing as mp nums = [1, 2, 3, 4, 5] def squared(x): return x ** x def cubed(x): return x * x * x def main(): pool = mp.Pool(mp.cpu_count()) # 并行执行squared,收集结果合并到res1 res1 = set(pool.map(squared, nums)) print(res1, set()) # 等待squared全部完成后,并行执行cubed res2 = set(pool.map(cubed, nums)) print(res1, res2) pool.close() pool.join() if __name__ == "__main__": main()
运行结果:
{1, 4, 27, 256, 3125} set() {1, 4, 27, 256, 3125} {1, 8, 27, 64, 125}
方案二:使用Manager创建跨进程共享集合
如果需要在子进程中直接修改集合,可以用multiprocessing.Manager创建共享集合对象,所有子进程修改的是同一个集合:
import multiprocessing as mp nums = [1, 2, 3, 4, 5] def squared(x, res_set): res_set.add(x ** x) def cubed(x, res_set): res_set.add(x * x * x) def main(): with mp.Manager() as manager: res1 = manager.set() res2 = manager.set() pool = mp.Pool(mp.cpu_count()) # 执行squared并等待完成 pool.map_async(squared, nums, args=(res1,)).get() print(res1, res2) # 执行cubed并等待完成 pool.map_async(cubed, nums, args=(res2,)).get() print(res1, res2) pool.close() pool.join() if __name__ == "__main__": main()
注意:共享对象会带来一定性能开销,若只是简单计算后收集结果,优先选择方案一。
内容的提问来源于stack exchange,提问作者bth
相关产品推荐
相关产品推荐

