tornado长连接断开的处理机制

Comments(12)


Posted on 2013-03-08 20:18:01 tornado


使用tornado的异步http调用时候,在继承RequestHandler的子类中,可以重载on_connection_close方法。
此方法在对端连接关闭,或者在socket上读写错误的时候被调用,可以让服务器做一些清理。

调用过程大概这样:

首先说明,ioloop没有保证读写出错的时候做什么,以及怎么做。 这些都是由iostream来操作的,因为它就是对ioloop的封装,增加了错误处理、各种情况下的回调、读写缓存等等。

1. on_connection_close虽然是在web.py中定义的,但是其实它是由iostream来调用,tcp_server/http_server都是继承了此方法。

2. iostream调用on_connectioin_close这个回调函数的是self.close()函数

3. 在以下函数中调用了self.close方法:

  • 在iostream的_handle_events函数中(这个函数由ioloop调用)
  • 在_run_callback中,当执行回调失败时调用。说明当服务端代码出错时,执行self.close.
  • 在_handle_read中调用,这个没啥悬念
  • 在read_from_fd中调用,这里其实就是直接从socket读数据
  • 在_handle_write中调用,同样没什么悬念
  • 在read_from_fd中调用,其实上面的_handle_read最终调用的还是read_from_fd
  • 在connect中调用,对于使用iostream作为client连接,也会调用

4. 接下来看看self.close的代码:

  def close(self, exc_info=False):
      """Close this stream.
  
      If ``exc_info`` is true, set the ``error`` attribute to the current
      exception from `sys.exc_info()` (or if ``exc_info`` is a tuple,
      use that instead of `sys.exc_info`).
      """
      if not self.closed():
          if exc_info:
              if not isinstance(exc_info, tuple):
                  exc_info = sys.exc_info()
              if any(exc_info):
                  self.error = exc_info[1]
          if self._read_until_close:
              callback = self._read_callback
              self._read_callback = None
              self._read_until_close = False
              self._run_callback(callback,
                                 self._consume(self._read_buffer_size))
          if self._state is not None:
              self.io_loop.remove_handler(self.fileno())
              self._state = None
          self.close_fd()
          self._closed = True
      self._maybe_run_close_callback()

最后一句,就是self._maybe_run_close_callback(),说明如果定义了on_connection_close函数,就调用它。在这句代 码的前面做了一些例如关闭连接、清除回调、从ioloop中移除回调等等。

5. 总的说来,还是不复杂的,合情合理。

前一篇: 关于HTTP长连接的保持和断开 后一篇: 更改linux栈空间大小

Captcha:
验证码

Email:

Content: (Support Markdown Syntax)


ok  2023-07-15 05:37:43 From 127.0.0.1

It’s in point of fact a great and helpful piece of info. I am happy that you shared this useful information with us. Please stay us up to date like this. Thanks for sharing.

My Website: Australian Open


OKBet  2023-07-19 07:16:19 From 127.0.0.1

You there, this is really good post here. Thanks for taking the time to post such valuable information. pba odds betting