1

私は2つのプロセスを持っています:

最初のプロセスは、バックグラウンドで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()

2 つ目は、マネージャーに定義された登録済みオブジェクトを使用するはずの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 , when using addChild into the consumer , while I can successfully use 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
4

1 に答える 1

1

偶発的であると思われる上記の他の多くのバグを修正することに加えて ( 、誤ったインデントなどのいくつかのインスタンスが欠落しているinit必要があります)、重要な点は、登録を次のようにすることです。__init__selfmanager.py

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

それを 2 番目の引数として何を達成しようとしているのかlambdaわかりませんが、2 番目の引数は、必要な型を作成する呼び出し可能なものである必要があり、使用しているような 2 項目のタプルを作成するものではありません。

于 2009-09-28T15:29:57.937 に答える