【发布时间】:2014-03-10 07:56:12
【问题描述】:
我正在运行一组 tornado 实例,这些实例处理来自一小组保持活动连接的许多请求。当我关闭服务器进行维护时,我想优雅地关闭保持活动的请求,以便我可以关闭服务器。有没有办法用 Tornado 告诉客户“嘿,这个套接字正在关闭”?我环顾四周,self.finish() 只是刷新了连接。
【问题讨论】:
我正在运行一组 tornado 实例,这些实例处理来自一小组保持活动连接的许多请求。当我关闭服务器进行维护时,我想优雅地关闭保持活动的请求,以便我可以关闭服务器。有没有办法用 Tornado 告诉客户“嘿,这个套接字正在关闭”?我环顾四周,self.finish() 只是刷新了连接。
【问题讨论】:
最终,我找到了一种我需要的优雅关闭的解决方案(请注意,这可能仅适用于 Tornado 3.2,因为它取决于具有连接的请求并检查 @ 987654321@ 属性。最终,除非它正在主动发送数据,否则无需关闭连接(因此杂散的现有连接并不重要)。
initialize() 中,我检查了这一点,如果我们要关闭,我将Connection: close 标头设置为符合 RFC,然后还设置self.request.connection.no_keep_alive = True 以在读取更多数据之前强制关闭连接,但之后请求已完成。相对简单 - 看起来像这样:
class GracefulRequestHandler(tornado.web.RequestHandler):
def initialize(self):
if self.application.is_shutting_down:
self.set_header('Connection', 'close')
self.request.connection.no_keep_alive = True
【讨论】:
finish() 不适用于此处,因为处于“keep-alive”状态的连接与RequestHandler 无关。一般来说,除了关闭它之外,您无法(或需要)对保持连接进行任何操作,因为浏览器没有监听响应。
Websockets 是另一回事 - 在这种情况下,您可能希望在关闭之前自己关闭连接(但不必这样做 - 您的客户端应该能够抵御刚刚消失的连接)。
【讨论】:
finish(),我需要在 Application 对象上做什么才能关闭连接?我知道突然关闭并不是什么大问题,但我想知道是否有办法指示龙卷风关闭所有打开的连接。
app._connections 并关闭每个连接,对吗?
HTTPServer._connections 不是公共属性,但现在有一个 close_all_connections 函数可供您使用(请注意,它是一个协程,因此它返回一个您必须等待的 Future)