私はこの問題をテストするためのコード例を以下に示します。 サーバのリモートオブジェクトのメソッドであるtestmaster.test()を呼び出すと、実行が永久に停止します(ここでは実際にはサーバまたはクライアントであるとは限りません)。Pyro4リモートオブジェクトのメソッドを永久にスタックして呼び出す。
は(ここに論理的であるかどうかわからない)Pyro4.callbackが、私はこの問題を解決することができますどのように私は、Python 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
しかし新しい問題今私は対処しています。私はエコーアルゴリズムを開発しています.1つのpythonファイルが複数回実行され、これらのすべてのプロセスがアルゴリズムの1つのノードになります(実行される最初のオブジェクト/プロセスはすべてのノードに関する情報を持つブートストラップになり、分散メッセージを開始します)。 ブートストラップにwhileループは(他のノードのリモートオブジェクトを呼び出して)ackを受信したときにdist msgをノードに送信します。他のノードがこのループ関数を呼び出しているため、ノードはdaemon.requestloop()呼び出しに到達しません。私はこれらの2つのステートメントを交換する場合、私はループ関数を呼び出すことはできません。 – Khalid
コード構造が間違っています。クライアントとサーバーのロジックを適切に分離していません。 –