使用startinpy在多进程中遇pickle序列化错误,求解决方案
解决startinpy DT对象子进程序列化错误的方案
问题根源
标准multiprocessing模块用pickle序列化对象传递给子进程,但startinpy.DT对象不支持pickle序列化,所以在Process子类的__init__里初始化dt会触发序列化错误。
解决方案步骤
1. 安装pathos
pathos的多进程模块用dill替代pickle,支持更多对象的序列化,执行安装命令:
pip install pathos
2. 替换Process并调整DT对象初始化时机
把标准库的Process换成pathos.multiprocessing.Process,同时不要在__init__里初始化DT对象,而是放到run方法中——因为__init__在父进程执行,会尝试序列化类成员;而run方法是子进程启动后才执行的,直接在子进程内创建DT对象,完全避开序列化问题。
3. 保留进程间通信组件
Event、SharedMemory、ShareableList这些组件可以正常和pathos结合使用,它们本身支持跨进程交互或序列化。
修改后的完整示例代码
import startinpy import time from pathos.multiprocessing import Process from multiprocessing import Event, SharedMemory, ShareableList class WorkCl: def __init__(self): # 初始化进程间通信组件 self.event = Event() self.shm = SharedMemory(create=True, size=1024) self.sh_list = ShareableList([1, 2, 3]) self.dtm = DTM(self.event, self.shm, self.sh_list) self.dtm.start() time.sleep(1) class DTM(Process): def __init__(self, event, shm, sh_list): Process.__init__(self) # 保存进程间通信组件,这些可以正常序列化 self.event = event self.shm = shm self.sh_list = sh_list # 不要在这里初始化DT! def run(self): # 子进程启动后再初始化DT对象 self.dt = startinpy.DT() # 示例:使用DT对象和进程间通信组件 print("子进程DT对象已初始化") # 比如向共享内存写入数据 self.shm.buf[:4] = b"test" # 设置事件 self.event.set() # 操作共享列表 self.sh_list[0] = 99 def some_method(self): # 类内其他方法可以正常使用self.dt if hasattr(self, 'dt'): print(f"DT点数:{self.dt.number_of_points()}") if __name__ == '__main__': wcl = WorkCl() # 等待子进程事件 wcl.event.wait() # 读取共享内存数据 data = wcl.shm.buf[:4].tobytes() print(f"父进程读取共享内存:{data}") print(f"父进程读取共享列表:{wcl.sh_list}") # 清理资源 wcl.sh_list.shm.close() wcl.shm.close() wcl.shm.unlink()
关键说明
- 把DT对象的初始化移到
run方法是核心:子进程独立创建DT,不需要父进程序列化传递 - pathos的Process兼容大部分标准multiprocessing的用法,同时支持dill序列化,解决了DT对象无法pickle的问题
- 进程间通信组件(Event、SharedMemory等)可以正常传递,因为它们本身设计为跨进程可用
内容的提问来源于stack exchange,提问作者dany
相关产品推荐
相关产品推荐

