다음은이 문제를 테스트하는 예제 코드입니다. 서버 원격 객체의 메소드 인 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()
감사 Irmen을 코드는 내가 가진 문제의 간단한 양식의 예이다. 네, 객체 자체 (원격 객체 아님)를 통해 메소드를 호출하여 해결했습니다. – Khalid
하지만 새로운 문제는 지금 대처 중입니다. 하나의 python 파일이 여러 번 실행되는 echo 알고리즘을 개발 중입니다.이 모든 프로세스가 알고리즘의 한 노드가됩니다 (실행되는 첫 번째 객체/프로세스는 모든 노드에 대한 정보가 있고 배포 된 메시지를 시작하는 부트 스트랩이됩니다) 부트 스트랩에는 while 루프는 (다른 노드의 원격 객체를 호출 할 때) ack 수신시 dist msg를 노드로 보냅니다. 다른 노드가이 루프 함수를 호출하여 노드가 daemon.requestloop() 호출에 도달하지 못하게합니다. 이 두 구문을 바꿔 가면 루프 함수를 호출 할 수 없습니다. – Khalid
코드 구조가 잘못되었습니다. 클라이언트와 서버 로직을 적절히 분리하지 않았습니다. –