【问题标题】:how to set connection timeout in tornado?如何在龙卷风中设置连接超时?
【发布时间】:2017-09-15 15:28:41
【问题描述】:

在某些情况下,在我的 Tornado 应用程序中,一些客户端与服务器断开连接,但我当前的代码未检测到客户端与服务器断开连接。我目前使用 ping 来确定客户端是否已断开连接。 这是我的乒乓球代码:

from threading import Timer
class SocketHandler(websocket.WebSocketHandler):
    def __init__(self, application, request, **kwargs):
        # some code here
        Timer(5.0, self.do_ping).start()
    def do_ping(self):
        try:
            self.ping_counter += 1
            self.ping("")
            if self.ping_counter > 2:
                self.close()
            Timer(60, self.do_ping).start()
        except WebSocketClosedError:
            pass

    def on_pong(self, data):
        self.ping_counter = 0

现在我想在 tornado 中设置 SO_RCVTIMEO 而不是使用乒乓球方法。 像这样:
sock.setsockopt(socket.SO_RCVTIMEO)
是否可以在 Tornado 中为关闭客户端在特定超时后设置 SO_RCVTIMEO ?

【问题讨论】:

  • @amn 如何在 Tornado 中使用 socket.SO_RCVTIMEO ?我阅读了文档,但找不到有用的东西。

标签: python sockets websocket tornado ping


【解决方案1】:

SO_RCVTIMEO 在 Tornado 这样的异步框架中不做任何事情。您可能希望将您的阅读内容包含在 tornado.gen.with_timeout 中。您仍然需要使用 ping 来测试连接并确保它仍在工作;如果连接空闲,则几乎无法保证系统需要多长时间才能注意到。 (TCP keepalives 是可能的,但这些不是在所有平台上都可以配置的,并且通常使用很长的超时时间。

【讨论】:

  • 谢谢。那么使用龙卷风我们无法检测或刷新空闲连接?即使使用with_timeout 生成器?
  • 您需要定期使用连接才能检测到故障。一般情况下 TCP 都是如此,而不仅仅是 Tornado(您需要阅读一些内容,SO_RCVTIMEO 才能在同步应用程序中工作)。在不尝试使用连接的情况下检测故障的唯一方法是使用 TCP keepalives,但有上述限制。
  • 另请注意,WebSocketHandler 现在在 Tornado 4.5 中内置了 ping 和超时支持,因此对于 websocket,您应该使用它而不是构建自己的故障检测器。
猜你喜欢
  • 1970-01-01
  • 2017-10-08
  • 1970-01-01
  • 2011-07-24
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多