Python多进程中类对象数据无法保存的问题排查
Python多进程修改对象数据后内容为空的问题解决
问题根源在于Python多进程的内存隔离机制:每个子进程启动时会完整复制父进程的内存空间,你传给子进程的AppendInProcess对象其实是原对象的副本。子进程里对副本的修改完全不会影响主进程中的原对象,进程结束后副本被销毁,所以主进程打印时看到的还是空列表。
解决办法:使用共享内存对象
通过multiprocessing.Manager创建可跨进程共享的对象,所有子进程操作的是同一个共享内存中的数据,主进程就能看到修改后的结果。修改后的代码如下:
import time from multiprocessing import Process, Manager class AppendInProcess: def __init__(self, shared_list): # 用Manager提供的共享列表替代普通列表 self.list = shared_list def appendToObj(self, value): self.list.append(value) def process_function(obj, value): obj.appendToObj(value) if __name__ == '__main__': processes = [] objects = [] time_start = time.time() # 启动Manager管理共享对象 with Manager() as manager: for i in range(20): # 为每个对象创建独立的共享列表 shared_list = manager.list() obj = AppendInProcess(shared_list) objects.append(obj) p = Process(target=process_function, args=(obj, i)) processes.append(p) p.start() # 等待所有子进程完成 for process in processes: process.join() time_end = time.time() print(f"耗时: {time_end - time_start} 秒") # 遍历打印每个对象的列表(转成普通list方便查看) for obj in objects: print(list(obj.list))
补充说明
Manager会启动一个独立的服务器进程,所有子进程通过代理访问共享对象,确保数据在进程间同步。- 如果不需要类包装,也可以直接传递
manager.list()给子进程进行操作,效果是一样的。
内容的提问来源于stack exchange,提问作者Meyer Buaharon
相关产品推荐
相关产品推荐

