マルチプロセッシング マネージャーを介して複合構造を共有しようとしていますが、複合クラス メソッドの 1 つだけを使用しようとすると、「 RuntimeError: maximum recursion depth exceeded 」という問題が発生しました。
クラスはcode.activestateのトークンであり、マネージャーに含める前に私がテストしました。
クラスをプロセスに取得し、そのaddChild()メソッドを呼び出すとき、プロセスの外では動作している間、 RunTimeErrorを保持しました。
複合クラスは ** ____getattr()____ ** メソッドを実装する SpecialDict クラスから継承します。
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によって提供される解決策は機能しますが、競合状態を回避することはできません