2017-02-26 11 views
0

다음은이 문제를 테스트하는 예제 코드입니다. 서버 원격 객체의 메소드 인 testmaster.test()를 호출하면 실행이 영원히 멈추게됩니다. 실제로는 여기서는 서버 또는 클라이언트입니다.Pyro4 원격 객체의 메소드를 영속적으로 호출.

은 (는 여기에 논리적 있는지 확실하지 않습니다) Pyro4.callback 내가이 문제를 해결할 수있는 방법은 파이썬 2.7.12 및 Pyro4 을 사용하고 를 하나 도움이되지 않아도 @, 어떤 도움을 이해할 수있을 것이다

#Run python -m Pyro4.naming in another terminal first: 
import Pyro4 

@Pyro4.expose 
@Pyro4.callback 
class Master: 
    @Pyro4.expose 
    @Pyro4.callback 
    def test(self): 
     print "this is test" 

nameserver = Pyro4.locateNS('localhost', 9090) 
deamon = Pyro4.Daemon() 
uri = deamon.register(Master()) 
nameserver.register("Master", uri, safe=True) 
testmaster=Pyro4.Proxy(uri)#Object of master to call some functions from it 
print "before calling test" #this will be executed 
testmaster.test() 
print "after calling test" #but not this, it just stuck forever- how can I make it to be executed 
deamon.requestLoop() 

답변

0

별도의 프로세스에서 데몬을 실행해야합니다. 그것이 Pyro가 의미하는 것입니다 : 다른 프로세스에서 메소드를 호출하는 것입니다!

나머지 코드와 동일한 프로세스에서 실행하면 이해가되지 않습니다. 왜 Pyro를 사용하면 좋을까요? 다른 프로세스 나 컴퓨터에 개체를 배포하지 않습니다.

testmaster.test() 호출이 Pyro 데몬에 연결하려고 시도했지만 아직 어느 곳에서도 실행되고 있지 않기 때문에 코드가 멈추는 이유가 있습니다. 그래서 소켓이 타임 아웃 될 때까지 멈출 것입니다. daemon.requestLoop()에는 절대로 도달하지 못했습니다. 그렇지만 코드가 틀린 경우에도 동일한 프로그램에서 데몬을 실행하고 Pyro를 통해 개체를 호출하는 것은 거의 의미가 없습니다.

내가 적어도 기초를 파악하기 위해 설명서에 소개를 읽고 제안 : http://pythonhosted.org/Pyro4/intro.html#simple-example

+0

감사 Irmen을 코드는 내가 가진 문제의 간단한 양식의 예이다. 네, 객체 자체 (원격 객체 아님)를 통해 메소드를 호출하여 해결했습니다. – Khalid

+0

하지만 새로운 문제는 지금 대처 중입니다. 하나의 python 파일이 여러 번 실행되는 echo 알고리즘을 개발 중입니다.이 모든 프로세스가 알고리즘의 한 노드가됩니다 (실행되는 첫 번째 객체/프로세스는 모든 노드에 대한 정보가 있고 배포 된 메시지를 시작하는 부트 스트랩이됩니다) 부트 스트랩에는 while 루프는 (다른 노드의 원격 객체를 호출 할 때) ack 수신시 dist msg를 노드로 보냅니다. 다른 노드가이 루프 함수를 호출하여 노드가 daemon.requestloop() 호출에 도달하지 못하게합니다. 이 두 구문을 바꿔 가면 루프 함수를 호출 할 수 없습니다. – Khalid

+0

코드 구조가 잘못되었습니다. 클라이언트와 서버 로직을 적절히 분리하지 않았습니다. –