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

Python中如何在Process类其他方法使用run方法内创建的复杂对象

解决Python多进程中Process类方法间共享run内创建对象的问题

错误原因

Python多进程模型中,每个进程拥有独立的内存空间。你定义的MyProcess实例在主进程初始化时,self.my_object被设为None;调用start()后,子进程会复制一份该实例的内存空间来运行run方法——子进程里修改的self.my_object只存在于自身内存中,主进程里的self.my_object仍保持初始的None状态,这就是调用get_name()触发AttributeError的根本原因。

解决方案

根据实际需求,可选择以下几种解决方式:

1. 使用进程间通信(IPC)传递数据

如果仅需获取子进程中对象的特定属性,用Queue或Pipe传递数据是最直接的方式:

import multiprocessing as mp

class DummyCls:
    def __init__(self):
        self.name = "Hii"

class MyProcess(mp.Process):
    def __init__(self, queue):
        super().__init__()
        self.queue = queue

    def run(self):
        my_object = DummyCls()
        my_object.name = "Hello"
        self.queue.put(my_object.name)  # 将需要的数据放入队列

if __name__ == '__main__':
    queue = mp.Queue()
    my_process = MyProcess(queue)
    my_process.start()
    
    # 从队列中取出子进程传递的数据
    name = queue.get()
    print(name)  # 输出: Hello
    
    my_process.join()

若需传递整个复杂对象,确保对象可被pickle序列化(多数自定义类默认支持),直接将对象放入队列即可。

2. 使用Manager创建共享对象

如果需要在主进程和子进程间共享整个复杂对象的状态,可使用multiprocessing.Manager。Manager会启动单独的管理进程,所有进程通过代理对象访问共享数据:

import multiprocessing as mp

class DummyCls:
    def __init__(self):
        self.name = "Hii"

class MyProcess(mp.Process):
    def __init__(self, shared_obj):
        super().__init__()
        self.shared_obj = shared_obj

    def run(self):
        self.shared_obj.name = "Hello"  # 修改共享对象的属性

if __name__ == '__main__':
    with mp.Manager() as manager:
        # 注册自定义类,让Manager可以创建其实例
        manager.register('DummyCls', DummyCls)
        shared_obj = manager.DummyCls()
        
        my_process = MyProcess(shared_obj)
        my_process.start()
        my_process.join()
        
        print(shared_obj.name)  # 输出: Hello

3. 在子进程内部调用方法

如果需求是在子进程执行过程中调用get_name(),而非主进程调用,直接在run方法内调用即可——此时所有操作都在子进程内存空间中,self.my_object已被正确初始化:

import multiprocessing as mp

class DummyCls:
    def __init__(self):
        self.name = "Hii"

class MyProcess(mp.Process):
    def __init__(self):
        super().__init__()
        self.my_object = None

    def run(self):
        self.my_object = DummyCls()
        self.my_object.name = "Hello"
        self.get_name()  # 子进程内部调用方法

    def get_name(self):
        print(self.my_object.name)  # 输出: Hello

if __name__ == '__main__':
    my_process = MyProcess()
    my_process.start()
    my_process.join()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:29