2017-09-14 40 views
0

我已经阅读了龙卷风ioloop和相关模块,以了解当套接字被接受并且请求被解析和处理时龙卷风会做什么。龙卷风在处理处理程序时如何处理远程关闭连接?

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


我建立一个测试处理机,所述get方法花费5秒睡眠(time.sleeo(5))。

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

我猜5秒处理程序是减慢龙卷风的事件循环,当龙卷风处理第二个处理程序,其连接已关闭,如果龙卷风知道,它不需要做下一步。

回答

0
  1. 请勿在Tornado应用程序中使用time.sleep();为什么请参阅this question

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

+0

谢谢Ben!我还有两个问题。 1.我的处理程序被写为阻塞,我知道这会阻止ioloop。我在执行处理程序之前检查了'socket'状态:在标有'MSG_PEEK'的那个'socket'上调用'recv',如果我得到空字符串我认为连接已经被远程关闭了,如果我得到了EAGAIN或EWOULDBLOCK异常我知道连接是活着的,这对我适合吗? 2.我想记录每个连接的接受时间,我添加了'accept_handler'的日志,但是我发现每个日志输出都是一个接一个的,我认为它们应该同时出现。 – dawncold

+0

如果您一次只提供一个连接即可,MSG_PEEK技巧可能会有效,但请记住,有时会检测到关闭连接需要很长时间*。我不明白你的第二个问题(最好把新问题当作新问题而不是评论)。 –