具有命名元组酸洗错误的多处理对象 [英] Multiprocessing objects with namedtuple - Pickling Error

查看:0
本文介绍了具有命名元组酸洗错误的多处理对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在要放入多处理的对象中使用命名元组时遇到问题。我收到了酸洗错误。我尝试了其他StackOverflow帖子中的几种方法,但都没有成功。以下是我的代码结构:

PACKAGE_MAIN、TEST_MODULE

 import myprogram.package_of_classes.data_object_module
 import ....obj_calculate

 class test(object):
       if __name__ == '__main__':
             my_obj=create_obj('myobject',['f1','f2'])
             input = multiprocessing.Queue()
             output = multiprocessing.Queue()
             input.put(my_obj)
             j=Process(target=obj_calculate, args=(input,output))
             j.start()

类的包、数据对象模块

 import collections
 import ....load_flat_file

 def get_ntuple_format(obj):
     nt_fields=''
     for fld in obj.fields:
         nt_fields=nt_fields+fld+', '
     nt_fields=nt_fields[0:-2]
     ntuple=collections.namedtuple('ntuple_format',nt_fields)
     return ntuple

 Class Data_obj:
    def __init__(self, name,fields):
        self.name=name
        self.fields=fields
        self.ntuple_form=get_ntuple_format(self)  

    def calculate(self):
        self.file_read('C:/files','division.txt')

    def file_read(self,data_directory,filename):
        output=load_flat_file(data_directory,filename,self.ntuple_form)
        self.data=output

Utils_Package、Utils_MODULE

def create_dataobj(name,fields):
    locals()[name]=Data_Obj(name,fields)
    return locals()[name]  

def obj_calculate(input,output):   
    obj=input.get()
    obj.calculate()
    output.put(obj)

LOADS_MODULE

def load_flat_file(data_directory,filename,ntuple_form):
     csv.register_dialect('csvrd', delimiter='	', quoting=csv.QUOTE_NONE)
     ListofTuples=[]
     with open(os.path.join(data_directory,filename), 'rb') as f:
          reader = csv.reader(f,'csvrd')
          for line in reader:
               if line:
                   ListofTuples.append(ntuple_form._make(line))
     return ListofTuples

我收到的错误是:

PicklingError: PicklingError: Can't pickle  class '__main__ . ntuple_format: it's not the same object as __ main __. ntuple_format
附注:当我从一个大型项目中提取此示例代码时,请忽略细微的不一致。

推荐答案

不能对动态(通过get_ntuple_format)创建的类(在本例中为命名元组)进行Pickle。若要使类可拾取,请在可导入模块的顶级it has to be defined

如果您只需要支持几种类型的元组,请考虑在模块的顶层提前定义它们,然后动态选择正确的元组。如果您需要完全动态的容器格式,请考虑只使用dict

这篇关于具有命名元组酸洗错误的多处理对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆