2011-12-14 6 views
2

Pyro4.DaemonオブジェクトのrequestLoopメソッドにいくつか問題があります。loopboostがFalseの場合でもrequestloop(loopCondition)は解放されません。

私が望むのは、requestLoop関数をリリースし、私のデーモンをシャットダウンするための "stop()"メソッドを遠隔呼び出しすることです。

この小さなexempleは動作しません

サーバ

#!/usr/bin/python 
# -*- coding: utf-8 -*- 
from daemon import Pyro4 

class Audit(object): 
    def start_audit(self): 
     with Pyro4.Daemon() as daemon: 
      self_uri = daemon.register(self) 
      ns = Pyro4.locateNS() 
      ns.register("Audit", self_uri) 
      self.running = True 
      print("starting") 
      daemon.requestLoop(loopCondition=self.still_running) 
      print("stopped") 
      self.running = None 

    def hi(self, string): 
     print string 

    def stop(self): 
     self.running = False 

    def still_running(self): 
     return self.running 

def main(): 

    # lancement de l'auditor 
    auditor = Audit() 
    auditor.start_audit() 

if __name__ == "__main__" : 
    main() 

CLIENT

私は何を期待することは、サーバ印刷 "こんにちは" とし、 "別のHI" とを見ることです
import Pyro4 

def main(): 

    with Pyro4.Proxy("PYRONAME:Audit") as au: 
     au.hi("hello") 
     au.hi("another hi") 
     au.stop() 

シャットダウン。

しかし、シャットダウンが発生しない場合でも、サーバーは依然としてrequestloopメソッドでブロックされています。 私が望む限り私のプロキシを使うことができます。

しかし、私は他のクライアントを作成した場合、最初のリモート呼び出しで、サーバーがシャットダウンし、クライアントがエラーをスローします:

Pyro4.errors.ConnectionClosedError: receiving: not enough data 

すべての私のテストは、私は2番目のプロキシを作成する必要があると言っています私のサーバーにrequestloopを渡すための例外をスローします。

この問題を解決する方法はありますか?

答えて

2

あなたは次のコメント表示されますソースでexamples/callback/client.pyを見れば:したがって

# We need to set either a socket communication timeout, 
# or use the select based server. Otherwise the daemon requestLoop 
# will block indefinitely and is never able to evaluate the loopCondition. 
Pyro4.config.COMMTIMEOUT=0.5 

を、あなたがする必要があるが、サーバーのファイルにCOMMTIMEOUTに設定されているし、それは私に応じて正常に動作しますテスト。

注:メソッドにprintステートメントを追加して、呼び出すタイミングを確認することもできます。上記の設定がなければ、新しいイベントが受信されたときにのみメソッドが実行されるように見えるので、runningからFalseに設定された次のイベントの後にサーバーはシャットダウンしません。たとえば、クライアントプログラムを2回実行すると、サーバーはシャットダウンします。

+0

うまく動作します。あなたに感謝します。 私は、リクエストループに対して3秒のタイムアウトがあったと言うTIMEOUTに関するいくつかの文書を読んでいます。多分古いバージョンですか? – ornoone

+0

タイムアウトの0.5秒は非常に短いことに注意してください。 ilはこの値でいくつかのタイムアウト例外を試しました:) 3.5秒はいいです – ornoone

関連する問題