我正在尝试使用 Pyro 来控制从机。我 rsync 必要的 python 文件,启动一个 Pyro 服务器,通过远程控制执行一些操作,然后我想告诉 Pyro 服务器关闭。
我无法让 Pryo 守护进程干净地关闭。它要么挂在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'