Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 关闭tornado中的所有(保持活动)插座连接?_Python_Sockets_Tornado - Fatal编程技术网

Python 关闭tornado中的所有(保持活动)插座连接?

Python 关闭tornado中的所有(保持活动)插座连接?,python,sockets,tornado,Python,Sockets,Tornado,我正在运行一组tornado实例,它们处理来自一小组保持活动连接的许多请求。当我关闭服务器进行维护时,我希望优雅地关闭保持活动的请求,以便我可以关闭服务器。有没有办法用Tornado告诉客户“嘿,这个插座正在关闭”?我环顾四周,发现self.finish()只是刷新连接。finish()在这里不适用,因为处于“保持活动”状态的连接与请求处理程序不关联。通常情况下,除了关闭保持活动状态的连接之外,您无法(或需要)执行任何操作,因为浏览器没有侦听响应 WebSocket是另一个故事——在这种情况下,

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

finish()
在这里不适用,因为处于“保持活动”状态的连接与
请求处理程序不关联。通常情况下,除了关闭保持活动状态的连接之外,您无法(或需要)执行任何操作,因为浏览器没有侦听响应


WebSocket是另一个故事——在这种情况下,您可能希望在关闭连接之前自己关闭连接(但不必这样做——您的客户端应该能够很好地抵御即将消失的连接)。

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

  • 我在应用程序上设置了一个变量,用于记录应用程序是否正在关闭
  • initialize()
    中,我检查这一点,如果我们正在关闭,我将
    连接: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()
    ,我需要在应用程序对象上做什么才能关闭连接?我知道突然关闭并不是一个大问题,但我想知道是否有方法指示tornado关闭所有打开的连接。目前没有任何方法可以关闭所有打开的连接,除非关闭进程。好的,谢谢-没问题我想要的答案是:)使用Tornado 4跟踪所有连接,您可以迭代
    应用程序。_connections
    并关闭每个连接,对吗?
    HTTPServer。_connections
    不是一个公共属性,但现在有一个close\u all\u connections函数可以使用(请注意,这是一个协同程序,因此它返回一个您必须等待的未来)