Я пытаюсь использовать составную структуру через многопроцессорный менеджер, но я чувствовал себя в беде с «RuntimeError: максимальная глубина рекурсии превышена» при попытке использовать только один из классов Composite методы.диспетчер многопроцессорной обработки пифа и составное распределение шаблонов
Класс является токеном от code.activestate и проверен мной перед включением в диспетчер.
При извлечении класса в процессе и вызывает его AddChild() метод, который я держал RuntimeError, в то время как за пределами процесса он работает.
Составной класс наследуется от класса SpecialDict, который реализует метод ** ____ getattr() ____ ** .
Может быть возможно, что при вызове AddChild() интерпретатор питона ищет другой ** ____ 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()
Посмотрите это related questions о том, как сделать прокси для CompositeDict() класса как предложено Альбертом.
Решение дается tgray работ, но не может избежать условий гонки
ли вы изменить код в любом случае, когда вы взяли его из кода .activestate? Можете ли вы опубликовать соответствующий код, который возвращает класс в процесс, а затем вызывает метод addChild()? – tgray
Код композита абсолютно не изменился. Я собираюсь обновить с помощью соответствующего кода .... – DrFalk3n
Вы хотите только 2 подпроцесса? Когда я запускаю свой код, он продолжает запускать все больше и больше процессов, пока не сработает. – tgray