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
相关产品推荐
相关产品推荐

