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

请求确认Python进程池共享变量副本的更新机制理解是否正确

Python进程池内存共享问题解析

问题描述

我了解Python进程池不共享内存,而是由各进程创建全局变量的副本。但对以下程序的运行结果感到困惑:

import multiprocessing as mp

def worker_function(item):
    x.append(item)
    print(x)


if __name__ == '__main__':

    x = []

    pool = mp.Pool(16)
    jobs = []
    for item in range(10):
        job = pool.apply_async(worker_function, (item,))
        jobs.append(job)

    for job in jobs:
        job.get()

    pool.close()
    pool.join()

    print(f"x at the end of pool execution: {x}")

程序输出示例:

[0]
[0, 2]
[1]
[3]
[4]
[5]
[6]
[7]
[6, 8]
[9]
x at the end of pool execution: []

我的理解是:multiprocessing库仅在进程创建初期复制一次变量,同一进程池中的任务会共享该变量副本,前一个任务对副本的更新会被后续任务读取到。请问能否确认我的理解是否正确?


解答

你的理解完全正确。

Python的multiprocessing.Pool在初始化时,会预先创建指定数量的子进程(这里是16个)。每个子进程启动时,会复制主进程的内存空间——包括全局变量x的初始空列表状态。

当通过apply_async提交任务时,这些任务会被分配到已有的子进程中执行。如果同一个子进程被分配了多个任务,后续任务看到的x就是该子进程之前任务修改后的副本,这就是输出中出现[0, 2]和[6, 8]的原因:这两组任务由同一个子进程处理,前一个任务对x的修改被后一个任务读取到了。

而主进程中的x始终保持初始的空列表,因为子进程的修改只作用于自身的内存副本,和主进程的内存空间完全隔离,所以最后主进程打印的x仍然是空的。

另外,进程池的任务调度由内部机制决定,输出顺序和任务分配情况并非固定,每次运行结果可能略有不同,但核心逻辑保持一致。


内容的提问来源于stack exchange,提问作者dvd8719

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 19:22:40