You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:52:59