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)


Yz5A37Syizv  2014-07-26 21:28:54 From 190.205.207.136

Knocked my socks off with knelowdge!


pzzR9Leps9M  2014-07-29 11:06:57 From 200.110.129.59

That’s a slick answer to a chlnaelging question http://qnmkwi.com [url=http://gvpmybd.com]gvpmybd[/url] [link=http://jslviu.com]jslviu[/link]


ZTyqlV1oYGF  2016-12-30 05:21:42 From 188.143.232.27

This is a neat sumayrm. Thanks for sharing!


hs6vu5DE5t  2017-01-02 05:13:17 From 188.143.232.32

I seahcred a bunch of sites and this was the best.


Priligy  2021-09-14 14:54:56 From 127.0.0.1

Real Progesterone Pills Visa No Prior Script


Actioto  2021-09-19 02:30:05 From 127.0.0.1

http://buylasixshop.com/ - Lasix


Zithromax  2021-09-23 02:12:20 From 127.0.0.1

Cialis Per Posta


Wilbur Doolittle  2022-04-21 20:59:19 From 127.0.0.1

Приветствуем вас! Можем предложить лучшие прогоны “убийцы” для веб-сайтов вашего конкурента. Всего от 2 тыс руб. - Гарантированный результат. Сайты ваших конкурентов “умрут”. - Максимальное число отрицательных фитбеков. - Собрана специальная база - выжимка максимально “смертельных” площадок из 10 000 000 ресурсов (спамные, порно, вирусы и так далее). Это работает бесперебойно. - Прогон производится сразу с 4-х серверов. - Непрерывный спам вирусных ссылок на официальный емейл. - Выполнение заказа на протяжении 40-240 часов день и ночь. Растянем как угодно по времени. - Прогон с запрещёнными ключевыми словами. Телега: @exrumer Skype: xrumer.pro WhatsApp: +7(977)536-08-36 icq: 5688885 Только Эти!


Petr Velkov  2022-06-27 21:58:06 From 127.0.0.1

Приветствуем вас! Готовы выполнить самые лучшие “убийственные” прогоны для интернет-сайтов вашего конкурента. Всего от 2000 р. - Стопроцентный эффект. Интернет-сайты конкурентов “умрут”. - Максимальное число негативных фитбеков. - Собрана специальная база - выжимка самых сильных площадок из 10 млн. интернет-сайтов (порно, вирусные, спам и т.д.). Это действует бесперебойно. - Прогон делаем одновременно с 4 мощных серверов. - Постоянная отправка активационных ссылок на электронную почту. - Можем растянуть по времени как угодно. - Прогоняем с запрещёнными ключевыми фразами. Телега: @exrumer Skype: xrumer.pro WhatsApp: +7(977)536-08-36 icq: 5688885 Только Эти!


Marissa  2022-09-29 20:38:43 From 127.0.0.1

вероятностное мышление Социометрия Онлайн