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

Python多进程是否共享同一对象?为何多进程对象ID相同?

关于Python多进程中对象ID相同的问题解析

嘿,这个问题我当初刚接触多进程的时候也绕了好久,咱们一步步把它掰明白~

核心前提:进程的内存空间是完全隔离的

首先得记住一个关键:每个进程都有自己独立的内存地址空间,进程之间的内存是不共享的(除非用专门的进程间通信机制)。所以你看到的“相同ID”,只是两个进程里的对象在各自内存空间里的地址数值一样,它们根本不是同一个对象——就像两个不同城市里的街道,碰巧都叫“Main Street”,但完全是两条不同的路。

为什么“执行相同代码”会导致ID相同?

当你用Python的multiprocessing模块创建子进程时,子进程会复制父进程的代码环境(或者说重新加载完全相同的代码逻辑)。如果你的代码里有一段固定的对象创建逻辑(比如my_obj = SomeClass()或者num = 100),那么父进程和子进程都会按照完全相同的步骤去创建这个对象。

在同一次脚本运行中,父进程和子进程的内存分配模式是一致的——系统给它们分配内存的顺序、规则相同,所以同一个对象在两个进程里会被分配到数值相同的内存地址,也就是id()返回的结果一样。这就是“因为两个进程执行相同代码”这句话的真正含义:相同的代码逻辑带来了相同的内存分配路径,最终导致地址数值重合。

你的测试输出为啥每次运行ID变,但同次运行里两个ID一致?

看你给出的测试结果:

➜ ~ python test2.py 4419085696 4419085696
➜ ~ python test2.py 4342830464 4342830464
...

这完全符合咱们上面说的逻辑:

  • 每次重新运行python test2.py,相当于启动了一个全新的父进程,系统会给这个新进程分配一套全新的内存空间,所以这次运行里的对象地址数值和上次不一样。
  • 但在同一次运行中,父进程和子进程执行的是完全相同的代码,内存分配逻辑一致,所以两个进程里的对象地址数值完全相同。

验证它们是不同对象的小实验

你可以给你的测试代码加一点逻辑,比如修改子进程里的对象,看看父进程的对象会不会变:

import multiprocessing

my_obj = [1, 2, 3]

def modify_and_print():
    global my_obj
    my_obj.append(4)
    print(f"子进程:obj内容={my_obj}, ID={id(my_obj)}")

if __name__ == "__main__":
    print(f"父进程:obj内容={my_obj}, ID={id(my_obj)}")
    p = multiprocessing.Process(target=modify_and_print)
    p.start()
    p.join()
    print(f"父进程:obj内容={my_obj}, ID={id(my_obj)}")

运行这个脚本,你会看到:

  • 父进程和子进程里的my_objID相同,但子进程修改了内容后,父进程的my_obj还是原来的[1,2,3]——这就实锤了它们是两个完全独立的对象,只是地址数值碰巧一样而已。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:02:18