2016-11-09 16 views
0

파이썬 클래스를 영구적으로 유지하여 지속적으로 상호 작용할 수 있습니다. 그 이유는이 클래스가 매우 메모리 집약적이어서 (1) 메모리에 여러 번 넣을 수없고 (2) 클래스를로드하는 것이 너무 느리다는 것을 의미합니다.서버에 저장된 파이썬 개체와 상호 작용

내가 모두 PyroRPYC를 사용하여이 구현을 시도하지만 이러한 패키지는 항상 객체를 삭제하고 내가하고 싶지 않아 정확히 어떤 (새로운 객체에게 새로운 요청이있을 때마다를 만들 것으로 보인다.

Pyro4.behavior @ (instance_mode = "하나")

단 하나의 인스턴스가 생성되는 것을 보장 :) 그러나, 나는 파이에 대해 다음 옵션을 발견했다. 그러나 여러 요청이 동시에 이루어질 수 있으므로 100 % 안전하지 않습니다. 내가하려는 일을 성취 할 수있는 더 좋은 방법이 있습니까?

미리 도움 주셔서 감사합니다. (나는 이것을 꽤 오래 동안 애써왔다.) 당신이 당신의 클래스 스레드가 안전하게하지 않으려면

L

+0

파이로의 기본 인스턴스 모드는 요청 당 * * 세션 당 * (프록시 연결) 당 새로운 인스턴스 *를 생성하지 않습니다. –

+0

이것은 실제로 내 실수로 인해 유감입니다! 나에게 이것은 세션 당 하나의 요청만을하기 때문에 다소 중요하다. 그러나 이것은 실제로 중요한 차이점이다. –

답변

1

, 당신은 "multiplex"SERVERTYPE, 이것은 그렇게 모든 원격 메소드 호출이 순차적으로 처리 할 것입니다 설정할 수 있습니다.

https://pythonhosted.org/Pyro4/servercode.html#server-types-and-concurrency-model :

다중화 서버 (서버 타입은 "멀티 플렉스")

이 서버는 모든 원격 메소드 호출을 순차적으로 처리하는 다중 접속을 사용한다. 이 서버에는 쓰레드가 사용되지 않습니다. 그것은 당신의 플랫폼 (kqueue, poll, select)에서 사용 가능한 최상의 지원 셀렉터를 사용합니다. 즉, 한 번에 하나의 메서드 호출 만 실행 중이므로 완료하는 데 시간이 걸리면 다른 모든 호출이 차례를 기다리고 있습니다 (다른 프록시를 사용하는 경우에도 마찬가지 임). 클래스를 등록하는 데 사용되는 인스턴스 모드는 인스턴스에 대한 동시 액세스가 수행되는 방식을 변경하지 않습니다. 모든 경우에 항상 활성 상태 인 하나의 호출 만 있습니다. 스레드가 없으므로 다른 스레드에서 객체를 동시에 호출 할 수 없습니다. Pyro가 언제 그리고 얼마나 자주 클래스 인스턴스를 생성하는지는 여전히 영향을 미칩니다.

+0

예. 그러나 서버 타입을 이와 같이 설정하는 것은 파이로 서버 객체가 동시에 호출되지 않도록 보장하는 한편, 스레드 서버에 남겨두고 pyro 서버 클래스의 중요 섹션을 정의하고이를 올바르게 잠글 수 있습니다 (''threading .Lock''). 더 나은 선택은 당신의 수업이 정확히 무엇을하고 있으며, 그것이 중요한 부분에서 얼마나 많은 시간을 할애하는지에 달려 있습니다. –

+1

이 솔루션을 이용해 주셔서 감사합니다! 나는 그것을 시도하고 완벽하게 작동하는 것 같습니다. 지금은 "멀티 플렉스"옵션을 사용하려고합니다. 클래스의 어느 부분이 잠겨 있는지 조사 할 시간을 가지기 전까지는 프로그램이 여전히 다소 개발 중이므로 곧 할 수 있습니다. 이것은 지금 100 %의 확실성을 가지고 있습니다. –