2009-09-28 2 views
1

는 I은 2 개 공정을 가지고파이썬 멀티 프록시

제 프로세스을 backgroung입니다 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에를 : 최대 재귀 깊이가, 을 초과 소비자하는 AddChild를 사용하는 경우 , 정확하게 setName을 사용할 수 있습니다.

방법 하는 AddChild이 CompositeDict에 속하는 에서는 setName, 나는 프록시 할 가정합니다.

무엇이 잘못 되었나요?

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 

답변

1

다른 많은 버그를 수정 외에 내가 생각하는 이상으로 실수 있습니다 (init 당신이 self, misindentation의 여러 인스턴스를 놓치고, __init__해야합니다,

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

: 등, 등), 키 비트에 manager.py에서 등록을 확인하는 것입니다 두 번째 인수로 lambda을 수행하려고 시도하고 있지만 두 번째 인수는 필요한 유형을 만드는 호출 가능이어야하며 사용중인 두 항목 튜플을 만드는 것은 아닙니다.

+0

"더 좋은 코드"로 수정되었습니다. 하지만 이번에는 계속 RuntimeError : 최대 재귀 깊이가 을 초과 할 때 addChild를 사용할 때 프록시가 괜찮은 것 같습니다. addChild는 http://code.activestate.com/recipes/498249/#clast 에서 가져온 컴포지트에서 가져 와서 나쁜 재 등장을 담당하는 것으로 보이는 "__getattr__"을 내부적으로 사용합니다. 어떤 아이디어 ?? – DrFalk3n

+1

이제는 질문에 controller.py 코드가 없으므로 어떤 도움도 더 어려워 질 것입니다 ...! -). –

+0

정말 다시 미안 해요, 나는 그것이 더 간단한 것이라고 생각 :-(필요한 컨트롤러없이.하지만이 문제는 나를 미치게 만듭니다. – DrFalk3n