TypeError:无法pickle“builtins.DT”对象 - 多处理、pickle、pathos

问题描述 投票:0回答:1

我在我的项目中使用“startinpy”库(https://startinpy.readthedocs.io/en/0.10.2/)。它通常工作得很好,但是当我想在第二个过程中使用它时,会出现 pickle 错误:

TypeError: cannot pickle 'builtins.DT' object

MRE:

import startinpy
from multiprocessing import Process


    class WorkCl:
        def __init__(self):
            self.dtm = DTM()  # PROCESS
            self.dtm.start()
            time.sleep(1)
    
    
    class DTM(Process):
        def __init__(self):
            Process.__init__(self)
            self.dt = startinpy.DT()
    
    
    if __name__ == '__main__':
        wcl = WorkCl()

有谁知道如何进行这项工作?我需要使用“dt”对象作为类对象,因为我在各种类方法中使用它。另外,我使用多处理事件对象来停止进程,并使用 SharedMemory 和 ShareableList 在进程之间共享信息。

我找到了名为“pathos”的库(https://pathos.readthedocs.io/en/latest/pathos.html),但我不明白如何准确地用它替换标准多处理模块。有人可以帮忙吗?

python multiprocessing pathos
1个回答
0
投票

不确定我完全理解您的用例,但恕我直言,不需要使用 DTM 类,有效的方法可以是使用 WorkCl 类中的静态方法来实例化您的 DT 对象:

import startinpy
from multiprocessing import Process


class WorkCl:
    def __init__(self):
        self.dtm_process = Process(target=self.run_dtm)
        # processes are spawned by creating a Process object and then calling its start() method
        self.dtm_process.start()
    
    @staticmethod
    def create_dt():
        # create DT object
        return startinpy.DT()

    def run_dtm(self):
        # Initialize the startinpy.DT object within the process
        self.dt = self.create_dt()
        print("DTM process started")
        print("DTM process ending")

    def stop(self):
        # Properly terminate the process
        self.dtm_process.terminate()  
        self.dtm_process.join() 

if __name__ == '__main__':
    wcl = WorkCl()
© www.soinside.com 2019 - 2024. All rights reserved.