Я пытаюсь поделиться составной структурой через диспетчер многопроцессорной обработки, но столкнулся с проблемой "RuntimeError: превышена максимальная глубина рекурсии" при попытке использовать только один из методов класса Composite.
Класс является токеном из code.activestate и протестирован мной перед включением в менеджер .
При извлечении класса в процесс и вызове его метода addChild() я сохранил RunTimeError, а вне процесса он работает.
Составной класс наследуется от класса SpecialDict, реализующего метод ** ____getattr()____ **.
Возможно ли, что при вызове addChild() интерпретатор python ищет другой ** ____getattr()____ **, потому что менеджер не проксирует правильный?
Если это так, мне не ясно, как правильно сделать прокси для этого класса/метода.
Следующий код воспроизводит именно это условие:
1) это файл 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) Я хочу использовать композит в этом 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) выполнить все запуски через 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()
Взгляните на связанные вопросы о том, как сделать прокси для класса CompositeDict(), предложенный AlberT.
Решение, данное tgray, работает, но не может избежать условий гонки.