2

Pyro4.Daemon オブジェクトの requestLoop メソッドに問題があります。

私が望むのは、リモートで「stop()」メソッドを呼び出して requestLoop 関数を解放し、デーモンをシャットダウンすることです。

この小さな例は機能しません

サーバ

#!/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()

クライアント

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番目のプロキシを作成し、サーバーでリクエストループを渡すために例外をスローする必要があると言っています。

この問題を解決する方法を知っている人はいますか?

4

1 に答える 1

4

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ステートメントを追加して、いつ呼び出されているかを確認することもできます。上記の構成がないと、新しいイベントが受信されたときにのみメソッドが実行されるように見えるため、に設定されstill_runningたイベントの次のイベントが受信された後、サーバーはシャットダウンしません。たとえば、クライアント プログラムを 2 回実行すると、サーバーがシャットダウンします。runningFalse

于 2011-12-14T17:10:11.700 に答える