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
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
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 ...! -). –
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