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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 05:05:08