【问题标题】:How tornado process remote close connection while it is processing handler?龙卷风在处理处理程序时如何处理远程关闭连接?
【发布时间】:2017-09-14 13:29:45
【问题描述】:

我已阅读 tornado ioloop 和相关模块,以了解当接受套接字并解析和处理请求时 tornado 会做什么。

我想知道tornado是否可以在请求连接关闭后停止请求处理?


我构建了一个测试处理程序,get 方法花费了 5 秒来休眠(time.sleeo(5))。

然后我向tornado发送了一些请求,所有请求都设置了读取超时3秒,我在tornado上发现了一些close_wait连接,几分钟后,这些连接正常关闭。

我猜5秒handler是拖慢tornado事件循环的,当tornado处理第二个handler时,它的连接已经关闭,如果tornado知道了,就不需要下一步了。

【问题讨论】:

    标签: tornado


    【解决方案1】:
    1. 不要在 Tornado 应用程序中使用 time.sleep();请参阅this question 了解原因。

    2. 当处理程序的耗时部分是非阻塞时,您可以定义一个方法on_connection_close(),该方法将在连接关闭时调用。通过这种方法,您可以取消正在进行的工作。您必须自己实现取消,例如通过在on_connection_close 中设置self.cancelled = True,然后在您正在进行的异步工作期间定期检查此属性。

    【讨论】:

    • 谢谢本!我还有两个问题。 1.我的handler写成blocking,我知道会阻塞ioloop。我在执行处理程序之前检查了socket 状态:使​​用标志socketsocket 上调用recv,如果我得到空字符串,我认为连接已被远程关闭,如果我得到EAGAIN 或EWOULDBLOCK 异常,我知道连接是有效的,这适合我吗? 2.我想记录每个连接接受时间,我在accept_handler添加了日志,但是我发现每个日志输出都是一个一个,我认为它们应该同时出现。
    • 如果您可以一次只提供一个连接,则 MSG_PEEK 技巧可能会起作用,但请记住,有时关闭连接需要 很长时间 时间检测到。我不明白你的第二个问题(最好将新问题作为新问题而不是作为 cmets 提出)。
    猜你喜欢
    • 1970-01-01
    • 2014-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多