tornado长连接断开的处理机制

news/2024/7/7 17:00:44

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

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

 1 def close(self, exc_info=False):
 2     """Close this stream.
 3 
 4     If ``exc_info`` is true, set the ``error`` attribute to the current
 5     exception from `sys.exc_info()` (or if ``exc_info`` is a tuple,
 6     use that instead of `sys.exc_info`).
 7     """
 8     if not self.closed():
 9         if exc_info:
10             if not isinstance(exc_info, tuple):
11                 exc_info = sys.exc_info()
12             if any(exc_info):
13                 self.error = exc_info[1]
14         if self._read_until_close:
15             callback = self._read_callback
16             self._read_callback = None
17             self._read_until_close = False
18             self._run_callback(callback,
19                                self._consume(self._read_buffer_size))
20         if self._state is not None:
21             self.io_loop.remove_handler(self.fileno())
22             self._state = None
23         self.close_fd()
24         self._closed = True
25     self._maybe_run_close_callback()

最后一句,就是self._maybe_run_close_callback(),说明如果定义了on_connection_close函数,就调用它。

在这句代码的前面做了一些例如关闭连接、清除回调、从ioloop中移除回调等等。

 

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

 

转载于:https://www.cnblogs.com/huazi/archive/2013/03/08/2950688.html


http://www.niftyadmin.cn/n/3388322.html

相关文章

flutter 下载地址

https://flutter.dev/docs/development/tools/sdk/releases#windows 右键得到谷歌的地址 因为墙的原因,将前面的域名换成 https://storage.flutter-io.cn

v20超级计算机,荣耀V20和华为P20Pro哪个好

荣耀V20和华为P20Pro哪个好?很多小伙伴们都还不知道,下面52z飞翔下载小编为大家整理了荣耀V20和华为P20Pro区别对比评测,一起来看看吧。荣耀V20和华为P20Pro哪个好荣耀V20荣耀V20采用6.4英寸魅眼全视屏,首创屏下摄像头技术&#x…

屏蔽百度

https://jingyan.baidu.com/article/17bd8e5278025685ab2bb80b.html

as 有坑,记录一下

今天遇到一个问题,自定义view一直显示空指针,而事实上layout里面是有的,路径也没错 项目之前一直好好的,都没动过这部分,所以觉得非常奇怪 找了半天,没找到问题,最后,as clean一下…

alevel计算机教材答案,alevel计算机教材电子版及内容和目录大纲

alevel计算机教材电子版及内容和目录大纲alevel物理教材PART 1 THEORY FUNDAMENTALSChapter 1 Information representation 2Chapter 2 Communication and Internet technologies 18Chapter 3 Hardware 36Chapter 4 Logic gates and logic circuits 49Chapter 5 Processor fund…

为组件uni-icons增加自定义图标

1.在阿里巴巴图标库找到需要的图标,下载为svg格式备用 2.通过在线ttf编辑器http://fontstore.baidu.com/static/editor/index.html#打开项目static文件夹下的uni.ttf文件 3.导入第一步下载的svg图标 4.选中新导入的图标,点击设置代码点,新增的…

flutter textfield hinttext的对齐问题

默认是英文的,但是因为英文中文有区别,所以在输入中文的时候会有问题 一种解决方法:materialapp节点下添加 localizationsDelegates: [GlobalMaterialLocalizations.delegate,GlobalWidgetsLocalizations.delegate],locale: const Locale(&…

计算机为什么逻辑判断准确,逻辑判断之评价型答题技巧

①评价逻辑漏洞评价逻辑漏洞也就是看题干推论犯了什么逻辑错误,常见逻辑错误有以下几种:诉诸未知、诉诸权威、数据不可比、自相矛盾、转移论题、混淆概念、模棱两可等等。【例题】在一次聚会上,10个人吃了水果色拉的人中,有5个很快…