Pyro を使用してスレーブ マシンを制御しようとしています。必要な python ファイルを rsync し、Pyro サーバーを起動し、リモート コントロールでいくつかのアクションを実行してから、Pyro サーバーにシャットダウンするように指示します。
Prio Daemon を正常にシャットダウンできません。呼び出しでハングするか、Daemon.close()
その行をコメントアウトすると、ソケットを正しくシャットダウンせずに終了しsocket.error: [Errno 98] Address already in use
、サーバーを再起動するのが早すぎます。
SO_REUSEADDR が適切な修正であるとは考えていません。ソケットが正しくシャットダウンされていないと、ソケットが TIME_WAIT 状態のままになり、一部のクライアントで問題が発生する可能性があるからです。より良い解決策は、Pyro Daemon にソケットを適切に閉じるよう説得することだと思います。
デーモン自体から Daemon.shutdown() を呼び出すのは不適切ですか?
サーバーを起動し、クライアントが接続されていない状態で CTRL-C を押しても、問題はありません (Address already in use
エラーは発生しません)。これにより、ほとんどの場合、クリーンなシャットダウンが可能に見えます (それ以外の場合は正常なクライアントとサーバーを想定しています)。
例:server.py
import Pyro4
class TestAPI:
def __init__(self, daemon):
self.daemon = daemon
def hello(self, msg):
print 'client said {}'.format(msg)
return 'hola'
def shutdown(self):
print 'shutting down...'
self.daemon.shutdown()
if __name__ == '__main__':
daemon = Pyro4.Daemon(port=9999)
tapi = TestAPI(daemon)
uri = daemon.register(tapi, objectId='TestAPI')
daemon.requestLoop()
print 'exited requestLoop'
daemon.close() # this hangs
print 'daemon closed'
例:client.py
import Pyro4
if __name__ == '__main__':
uri = 'PYRO:TestAPI@localhost:9999'
remote = Pyro4.Proxy(uri)
response = remote.hello('hello')
print 'server said {}'.format(response)
try:
remote.shutdown()
except Pyro4.errors.ConnectionClosedError:
pass
print 'client exiting'