2017-02-26 12 views
0

私はこの問題をテストするためのコード例を以下に示します。 サーバのリモートオブジェクトのメソッドである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() 

答えて

0

デーモンを別のプロセスで実行する必要があります。 Pyroは他のプロセスのメソッドを呼び出すためのものです。

コードの残りの部分と同じプロセスで実行することは意味がありません。なぜPyroを使用するのですか?オブジェクトを別のプロセスやマシンに配布しているわけではありません。

testmaster.test()コールがPyroデーモンに接続しようとしていても、まだどこでも実行されていないため、コードがハングする理由があります。だから、ソケットがタイムアウトするまでハングします。 daemon.requestLoop()には決して到達しませんが、たとえそうであったとしても、コードは間違っています。デーモンを実行し、Pyro経由で同じプログラムでオブジェクトを呼び出すのはほとんど意味がありません。

私は、少なくとも基本を把握するために、手動での導入を読んでお勧め:http://pythonhosted.org/Pyro4/intro.html#simple-example

+0

おかげIrmenを、 コードは、私が持っていた問題の単純なフォームの例でした。 ええ、オブジェクト(リモートオブジェクトではない)を介してメソッドを呼び出すことで解決しました。 – Khalid

+0

しかし新しい問題今私は対処しています。私はエコーアルゴリズムを開発しています.1つのpythonファイルが複数回実行され、これらのすべてのプロセスがアルゴリズムの1つのノードになります(実行される最初のオブジェクト/プロセスはすべてのノードに関する情報を持つブートストラップになり、分散メッセージを開始します)。 ブートストラップにwhileループは(他のノードのリモートオブジェクトを呼び出して)ackを受信したときにdist msgをノードに送信します。他のノードがこのループ関数を呼び出しているため、ノードはdaemon.requestloop()呼び出しに到達しません。私はこれらの2つのステートメントを交換する場合、私はループ関数を呼び出すことはできません。 – Khalid

+0

コード構造が間違っています。クライアントとサーバーのロジックを適切に分離していません。 –

関連する問題