我正在尝试通过多处理管理器共享复合结构,但在尝试仅使用一种复合类方法时,我感到“ RuntimeError: maximum recursion depth exceeded ”有问题。
该类是来自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()
按照 AlberT 的建议,查看有关如何为 CompositeDict() 类进行代理的相关问题。
tgray给出的解决方案有效,但无法避免竞争条件