【问题标题】:Close all (keep-alive) socket connections in tornado?关闭龙卷风中的所有(保持活动状态)套接字连接?
【发布时间】:2014-03-10 07:56:12
【问题描述】:

我正在运行一组 tornado 实例,这些实例处理来自一小组保持活动连接的许多请求。当我关闭服务器进行维护时,我想优雅地关闭保持活动的请求,以便我可以关闭服务器。有没有办法用 Tornado 告诉客户“嘿,这个套接字正在关闭”?我环顾四周,self.finish() 只是刷新了连接。

【问题讨论】:

    标签: python sockets tornado


    【解决方案1】:

    最终,我找到了一种我需要的优雅关闭的解决方案(请注意,这可能适用于 Tornado 3.2,因为它取决于具有连接的请求并检查 @ 987654321@ 属性。最终,除非它正在主动发送数据,否则无需关闭连接(因此杂散的现有连接并不重要)。

    1. 我在应用程序上设置了一个变量来记录应用程序是否正在关闭。
    2. 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
    

    【讨论】:

      【解决方案2】:

      finish() 不适用于此处,因为处于“keep-alive”状态的连接与RequestHandler 无关。一般来说,除了关闭它之外,您无法(或需要)对保持连接进行任何操作,因为浏览器没有监听响应。

      Websockets 是另一回事 - 在这种情况下,您可能希望在关闭之前自己关闭连接(但不必这样做 - 您的客户端应该能够抵御刚刚消失的连接)。

      【讨论】:

      • 我知道finish(),我需要在 Application 对象上做什么才能关闭连接?我知道突然关闭并不是什么大问题,但我想知道是否有办法指示龙卷风关闭所有打开的连接。
      • 目前没有任何方法可以关闭所有打开的连接,除非关闭进程。
      • 好的,谢谢 - 这就是我正在寻找的答案 :)
      • 使用 Tornado 4 跟踪所有连接,您可以遍历 app._connections 并关闭每个连接,对吗?
      • HTTPServer._connections 不是公共属性,但现在有一个 close_all_connections 函数可供您使用(请注意,它是一个协程,因此它返回一个您必须等待的 Future)
      猜你喜欢
      • 1970-01-01
      • 2014-09-24
      • 1970-01-01
      • 2012-01-13
      • 2018-11-08
      • 2011-07-03
      • 2010-09-23
      • 1970-01-01
      • 2012-07-08
      相关资源
      最近更新 更多