向multiprocessing.Process传递外部内存地址的方案为何失效?
为什么传递内存地址让子进程修改父进程复杂对象的方案会失效?
这个方案会在三个核心环节彻底失效,本质原因是多进程的地址空间隔离特性:
1. 进程私有地址空间导致内存地址完全无效
Python的multiprocessing模块创建的子进程,会拥有完全独立的虚拟地址空间。父进程里的内存地址只是父进程虚拟地址空间的标识,到了子进程里,这个地址要么指向一片无效的内存区域,要么指向子进程自己地址空间里的无关数据——两个进程的虚拟地址和物理内存的映射关系完全不共享,所以你传递的内存地址在子进程中没有任何意义,retrieve_data根本无法拿到父进程里的complex_class_object。
2. Python对象的解释器私有性无法跨进程解析
就算你强行通过某种手段拿到了物理内存地址,Python的对象是由解释器管理的:每个进程的Python解释器维护自己的对象引用计数、类型信息等元数据。子进程的解释器完全不认识父进程里的对象结构,直接解析内存地址只会得到一堆乱码,甚至会直接导致子进程崩溃。
3. 写时复制机制让修改只作用于副本
退一万步说,就算在Unix系统下,子进程启动时用了写时复制(Copy-On-Write)机制,初始时和父进程共享物理内存页,但只要子进程尝试修改对象,系统就会把对应的内存页复制一份给子进程,子进程修改的只是自己的副本,父进程里的原对象不会有任何变化,完全达不到“修改同一数据”的目的。
你提供的伪代码示例
class ComplexClass: def __init__(self, complex_data): self.complex_data = complex_data def change_data(self): self.complex_data = changes complex_class_object = ComplexClass(...) def data_operation(memory_address_of_complex_data): _complex_class_object = retrieve_data(memory_address_of_complex_data) _complex_class_object.change_data() memory_address_of_complex_data = memory_address_of(complex_class_object) process = multiprocessing.Process( target=data_operation, args=(memory_address_of_complex_data, *args), kwargs=kwargs) process.start() process.join()
内容的提问来源于stack exchange,提问作者Luggie
相关产品推荐
相关产品推荐

