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

