다중 처리 관리자를 통해 복합 구조를 공유하려고하는데 Composite 클래스 중 하나만 사용하려고하면 "RuntimeError : 최대 재귀 깊이 초과"문제가 발생했습니다. 행동 양식.파이썬 다중 처리 관리자 및 복합 패턴 공유
클래스는 code.activestate의 토큰이며 관리자가 포함하기 전에 나를 테스트했습니다. 프로세스 외부에서 작동하면서
방법으로 클래스를 검색하고 그 하는 AddChild() 메소드를 호출
는 I은 RuntimeError에 보관.복합 클래스는 ** __ getattr() __ ** ** 메서드를 구현하는 SpecialDict 클래스에서 상속합니다.
addChild()을 호출하는 동안 Python의 해석기가 관리자가 프록시를 사용하지 않았기 때문에 다른 ** __ getattr() ____ **을 검색 할 수 있습니까?
경우는
은 다음 코드는 바로이 조건을 재현 클래스/메소드에 프록시를 만들기 위해 올바른 방법으로 나에게 분명하지 않도록 :
이는 manager.py입니다)1
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에 프록시 작업을 수행하는 방법에 대한이
related questions() 클래스 을 가져 가라.
tgray 작품에 의해 주어진 솔루션하지만 피할 수없는 경쟁 조건
당신은 어떤 방법으로 코드를 변경나요 : 당신은 당신이
당신은 예를 들어이 문서에서 볼 수 있었다 CompositeDict에 프록시를 만들 필요가 다른 세계에서
.activestate? 클래스를 프로세스로 가져 오는 관련 코드를 게시 한 다음 addChild() 메서드를 호출 할 수 있습니까? – tgray
복합 코드는 절대 변경되지 않습니다. 관련 코드로 업데이트 할 예정입니다 .... – DrFalk3n
2 개의 하위 프로세스 만 필요합니까? 코드를 실행할 때 실패 할 때까지 계속해서 프로세스를 시작합니다. – tgray