蟒多代理

问题描述:

我有一个2点的过程:蟒多代理

第一工艺是manager.py开始于backgroung

from multiprocessing.managers import SyncManager, BaseProxy 
from CompositeDict import * 

class CompositeDictProxy(BaseProxy): 

    _exposed_ = ('addChild', 'setName') 
    def addChild(self, child): 
     return self._callmethod('addChild', [child]) 

    def setName(self, name): 
     return self._callmethod('setName', [name]) 

class Manager(SyncManager): 
    def __init__(self): 
     super(Manager, self).__init__(address=('127.0.0.1', 50000), authkey='abracadabra') 

def start_Manager(): 
    Manager().get_server().serve_forever() 

if __name__=="__main__": 
    Manager.register('get_plant', CompositeDict, proxytype=CompositeDictProxy) 
    start_Manager() 

,第二个是consumer.py应该使用定义在管理器中的注册对象:

from manager import * 
import time 
import random 

class Consumer(): 

    def __init__(self): 
     Manager.register('get_plant') 

     m = Manager() 
     m.connect() 
     plant = m.get_plant() 
     #plant.setName('alfa') 
     plant.addChild('beta') 


if __name__=="__main__": 
    Consumer() 

运行在后台的经理,而且比消费者我得到的错误信息:使用的addChild消费者时最大递归深度超过, : RuntimeError ,而我可以正确使用setName

方法的addChild的setName属于CompositeDict,我想被代理。

怎么了?

CompositeDict覆盖天然__getattr__ __方法,并且涉及该错误消息。我想,在某种程度上,它并没有使用正确的方法__getattr__方法。如果是的话我怎么能解决这个问题?


详细的错误信息是:

Traceback (most recent call last): 
    File "consumer.py", line 21, in <module> 
    Consumer() 
    File "consumer.py", line 17, in __init__ 
    plant.addChild('beta') 
    File "<string>", line 2, in addChild 
    File "/usr/lib/python2.5/site-packages/multiprocessing-2.6.1.1-py2.5-linux-i686.egg/multiprocessing/managers.py", line 729, in _callmethod 
    kind, result = conn.recv() 
    File "/home/--/--/CompositeDict.py", line 99, in __getattr__ 
    child = self.findChild(name) 
    File "/home/--/--/CompositeDict.py", line 185, in findChild 
    for child in self.getAllChildren(): 
    File "/home/--/--/CompositeDict.py", line 167, in getAllChildren 
    l.extend(child.getAllChildren()) 
    File "/home/--/--/CompositeDict.py", line 165, in getAllChildren 
    for child in self._children: 
    File "/home/--/--/CompositeDict.py", line 99, in __getattr__ 
    child = self.findChild(name) 
    File "/home/--/--/CompositeDict.py", line 185, in findChild 
    for child in self.getAllChildren(): 
    File "/--/--/prove/CompositeDict.py", line 165, in getAllChildren 
    for child in self._children: 
    ... 
    File "/home/--/--/CompositeDict.py", line 99, in __getattr__ 
    child = self.findChild(name) 
    File "/home/--/--/CompositeDict.py", line 185, in findChild 
    for child in self.getAllChildren(): 
    RuntimeError: maximum recursion depth exceeded 

除了在固定许多其他错误上面我以为是偶然的(init必须__init__,你缺少的self,misindentation几个实例,等,等),键位是使登记在manager.py成:

Manager.register('get_plant', CompositeDict, proxytype=CompositeDictProxy) 

不知道你在尝试完成什么,并将lambda作为第二个参数,但第二个参数必须是可以调用的类型,而不是像你使用的那样生成两个元组的元素。

+0

更正了一个“更好的”代码抱歉。 但是,这次我保持RuntimeError:当使用addChild代理似乎没问题时,最大递归深度超过 。 addChild来自一个综合采取http://code.activestate.com/recipes/498249/#clast ,并使内部使用“__getattr__”似乎是不良recusion的责任。任何想法?? – DrFalk3n 2009-09-28 16:00:11

+1

现在你在你的问题的任何地方都没有controller.py代码 - 使它更难以提供任何帮助......! - )。 – 2009-09-28 17:10:12

+0

真的再次抱歉,我认为它会更简单:-(没有没有必要的控制器。但是这个问题让我发疯了 – DrFalk3n 2009-09-28 17:28:19