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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 01:39:00