2009-09-28 7 views
1

I ont un processus 2:python multitraitement proxy

le premier processus est manager.py commence à 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() 

et le second consumer.py supposé utiliser les objets enregistrés définis dans le gestionnaire:

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

Exécution du gestionnaire en arrière-plan, et que le consommateur je reçois le message d'erreur: RuntimeError: Profondeur maximale de récursivité a dépassé, lors de l'utilisation addChild dans le consommateur , alors que je peux utiliser correctement setName.

Méthodes addChild et setName appartient à CompositeDict, je suppose être approximé.

Qu'est-ce qui ne va pas?

CompositeDict méthode native remplace __getattr__ __ et est impliqué dans le message d'erreur. Je suppose, d'une certaine façon, que ce n'est pas la bonne méthode __getattr__. Si oui, comment pourrais-je résoudre ce problème ??


Le message d'erreur détaillé est:

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 

Répondre

1

Outre la fixation de nombreux autres bugs dans ce qui précède que je suppose sont accidentelles (init doit être __init__, vous manquez plusieurs instances de self, misindentation, etc, etc), le bit clé est de rendre l'inscription à manager.py dans:

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

aucune idée de ce que vous essayez d'accomplir w/lambda comme deuxième argument, mais le second argument doit être l'appelable qui fait le type dont vous avez besoin, pas un qui fait un double-item comme vous utilisez.

+0

Correction du code avec un "meilleur" désolé. Mais cette fois, j'ai gardé RuntimeError: profondeur de récursivité maximale dépassé lors de l'utilisation de addChild alors que le proxy semble être ok. addChild vient d'un Composite pris là http://code.activestate.com/recipes/498249/#clast et fait usage interne de "__getattr__" qui semble être responsable de la mauvaise recusion. Une idée?? – DrFalk3n

+1

Maintenant, vous n'avez plus de code controller.py dans votre question - il est de plus en plus difficile de vous offrir de l'aide ...! -). –

+0

vraiment encore désolé, je pensais que ce serait plus simple :-(sans contrôleur non nécessaire.Mais ce problème me rend fou – DrFalk3n

Questions connexes