Je tente de partager une structure composite à travers un gestionnaire multiprocesseur mais je me suis senti en difficulté avec un "RuntimeError: profondeur de récursivité maximale dépassé" en essayant d'utiliser un seul de la classe Composite méthodespython gestionnaire de multiprocessing et partage de modèles composites
La classe est symbolique de code.activestate et testé par moi avant d'être inclus dans le gestionnaire.
Lors de la récupération de la classe en un processus et invoquant son addChild() méthode j'ai gardé le RuntimeError, en dehors du processus cela fonctionne.
La classe composite hérite d'une classe SpecialDict, qui implémente une méthode ** ____ getattr() ____ ** .
Pourrait être possible que lors de l'appel addChild() l'interpréteur de python cherche un ** ____ getattr() ____ ** différent parce que le droit n'est pas mandaté par le gestionnaire?
Si oui Ce n'est pas clair pour moi la bonne façon de faire une procuration à cette classe/méthode
Le code suivant exactement cette condition reproduis:
1) c'est le manager.py:
from multiprocessing.managers import BaseManager
from CompositeDict import *
class PlantPurchaser():
def __init__(self):
self.comp = CompositeDict('Comp')
def get_cp(self):
return self.comp
class Manager():
def __init__(self):
self.comp = QueuePurchaser().get_cp()
BaseManager.register('get_comp', callable=lambda:self.comp)
self.m = BaseManager(address=('127.0.0.1', 50000), authkey='abracadabra')
self.s = self.m.get_server()
self.s.serve_forever()
2) Je veux utiliser le composite dans ce consumer.py:
from multiprocessing.managers import BaseManager
class Consumer():
def __init__(self):
BaseManager.register('get_comp')
self.m = BaseManager(address=('127.0.0.1', 50000), authkey='abracadabra')
self.m.connect()
self.comp = self.m.get_comp()
ret = self.comp.addChild('consumer')
3) exécuter tout lancement par un controller.py:
from multiprocessing import Process
class Controller():
def __init__(self):
for child in _run_children():
child.join()
def _run_children():
from manager import Manager
from consumer import Consumer as Consumer
procs = (
Process(target=Manager, name='Manager'),
Process(target=Consumer, name='Consumer'),
)
for proc in procs:
proc.daemon = 1
proc.start()
return procs
c = Controller()
Jetez un oeil sur ce related questions comment faire une procuration pour la classe CompositeDict() comme suggéré par AlberT.
La solution donnée par tgray œuvres, mais ne peut pas éviter les conditions de course
Avez-vous modifié le code de quelque manière que lorsque vous l'avez pris à partir du code .activestate? Pouvez-vous poster le code pertinent qui récupère la classe dans un processus puis appelle la méthode addChild()? – tgray
Le code du composite est absolument inchangé. Je vais mettre à jour avec un code pertinent .... – DrFalk3n
Voulez-vous seulement 2 sous-processus? Lorsque je lance votre code, il continue de lancer de plus en plus de processus jusqu'à ce qu'il échoue. – tgray