1

我有两个过程:

第一个过程是manager.py背景开始:

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()

在后台运行管理器,而不是消费者我收到错误消息: RuntimeError: maximum recursion depth exceeded,当使用addChild进入消费者时,我可以正确使用setName

方法addChildsetName属于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
4

1 回答 1

1

除了修复上面我认为是偶然的许多其他错误(init必须是__init__,您缺少几个实例self,错误缩进等)之外,关键是要使注册manager.py成为:

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

不知道你想用第二个参数来完成什么lambda,但第二个参数必须是可调用的,使你需要的类型,而不是像你正在使用的那样制作双项元组的可调用对象。

于 2009-09-28T15:29:57.937 回答