Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在并行Python中返回对象(类)_Python_Parallel Processing - Fatal编程技术网

在并行Python中返回对象(类)

在并行Python中返回对象(类),python,parallel-processing,Python,Parallel Processing,我创建了一个函数,它接受一个值,进行一些计算,并作为一个对象返回不同的答案。然而,当我尝试使用pp并行化代码时,我得到了以下错误 文件trmm.py,第8行,在getattr中 返回self.header\u数组[名称] RuntimeError:调用Python对象时超出了最大递归深度 下面是我试图做的一个简单版本 class DataObject(object): """ Class to handle data objects with several arrays.

我创建了一个函数,它接受一个值,进行一些计算,并作为一个对象返回不同的答案。然而,当我尝试使用pp并行化代码时,我得到了以下错误

文件trmm.py,第8行,在getattr中 返回self.header\u数组[名称] RuntimeError:调用Python对象时超出了最大递归深度

下面是我试图做的一个简单版本

class DataObject(object):
    """
    Class to handle data objects with several arrays.

    """
    def __getattr__(self, name):
        try:
            return self.header_array[name]
        except KeyError:
            try:
                return self.line[name]
            except KeyError:
                raise AttributeError("%s instance has no attribute '%s'" %(self.__class__.__name__, name))

    def __setattr__(self, name, value):
        if name in ('header_array', 'line'):
            object.__setattr__(self, name, value)
        elif name in self.line:
            self.line[name] = value
        else:
            self.header_array[name] = value

class TrmmObject(DataObject):
    def __init__(self):
        DataObject.__init__(self)                            
        self.header_array = {
            'header': None
            }
        self.line = {
            'longitude': None,
            'latitude': None
            }

if __name__ == '__main__':
    import pp
    ppservers = ()
    job_server = pp.Server(2, ppservers=ppservers)
    def get_monthly_values(value):                
        tplObj = TrmmObject()
        tplObj.longitude = value
        tplObj.latitude = value * 2
        return tplObj
    job1 = job_server.submit(get_monthly_values, (5,), (DataObject,TrmmObject,),("numpy",))
    result = job1()
如果我将return-tplObj更改为return[tplObj.longitude,tplObj.latitude],则没有问题。然而,正如我之前所说的,这是一个简单的版本,实际上,这个更改会使程序复杂很多


我非常感谢您的帮助。

您几乎不需要使用getattr和setattr,并且它几乎总是以一些事情结束,无限递归就是一个典型的效果。我也看不出有什么理由在这里使用它们。要明确,直接使用行和头数组字典

如果需要一个在所有数组中查找值的函数,请为此创建一个函数并显式调用它。调用函数uu getitem_uuu并使用[]是显式的:-


另外,请不要调用字典头数组,这会让人困惑。

关于名称头数组,您完全正确,我会更改它。使用getattr和setattr的原因是,我可以编写obj.longitude而不是obj.line['longitude'],其中obj=TrmmObject,而且如果我使用非预定义属性,它将在header_数组下结束,例如obj.names='bla'。埃里克:是的,编写obj.longitude而不是obj.line['longitude']不是使用getattr和setattr的好理由。也许不是。如果我按照建议删除DataObject,它确实可以工作。然而,在我的实际程序中,我经常使用setattr和getattr。那么,有什么方法可以让它在数据对象仍然存在的情况下工作吗?@Erik:可能,但因为它只是并行化时的一个问题,它可能是某种竞争条件,这肯定不容易修复。