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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:06:04