用Tornado request_time 给页面添加响应时间

在PHP 程序里面经常在页脚看到这些服务器响应时间,在Tornado 下也好实现。

效果参见本站页脚,本站已启用 Memcache 来保存html ,所看到的响应时间是首次响应时间。

Tornado request time

源码

Tornado.web request_time 源码:

1
2
3
4
5
6
def request_time(self):
    """Returns the amount of time it took for this request to execute."""
    if self._finish_time is None:
        return time.time() - self._start_time
    else:
        return self._finish_time - self._start_time

更详细参见 tornado/wsgi.py

解析

记录的时间是请求开始处理到现在的时间,而并到达时间到发送时间。因此在并发量过大时,调用接口的代码可能发生超时,而此时间打印出来的时间却不存在超时,因为它不包括在epoll事件队列中的等待时间。

下面为 request_time() 函数原型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class HTTPRequest(object):  
       def __init__(self, method, uri, version="HTTP/1.0", headers=None,  
                 body=None, remote_ip=None, protocol=None, host=None,  
                 files=None, connection=None):  
        ...  
        self._start_time = time.time()  
        self._finish_time = None  
        ...  
         
  
    def request_time(self):  
        """Returns the amount of time it took for this request to execute."""  
        if self._finish_time is None:  
            return time.time() - self._start_time  
        else:  
            return self._finish_time - self._start_time 

其中 self._start_time 是在 HTTPRequest 初始化是被赋值。而初始化的位置就在开始处理数据包的时刻,代码位于 HTTPConnection 类的解析请求头部函数 _on_headers 中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//HttpServer.py  
class HTTPConnection(object):  
  
    def _on_headers(self, data):  
        try:  
           ...  
  
            self._request = HTTPRequest(  
                connection=self, method=method, uri=uri, version=version,  
                headers=headers, remote_ip=remote_ip)  
  
            ...  
        except _BadRequestException, e:  
            logging.info("Malformed HTTP request from %s: %s",  
                         self.address[0], e)  
            self.close()  
            return  

缺点

因为每次响应的时间有可能不同,tornado 自带的计算页面Etag 就不同,不能给客户端返回304 代码,导致每次请求服务器都计算页面Etag 值,也浪费了一些流量。但实际应用里,很少有用户无聊的刷新单一页面。

本文网址: https://pylist.com/topic/12.html 转摘请注明来源

Suggested Topics

用github 帐号登录之tornado 实现

用github 帐号登录之tornado 实现,主要面向开发者的可以使用这个第三方登录。在gist 上发现的,直接拿来,简单修改一下。...

Tornado 构建一个 Comet 应用

Comet -- 基于 HTTP 长连接、无须在浏览器端安装插件的“服务器推”技术为“Comet”,这里介绍用Tornado 构建一个 Comet 应用的经验。...

服务器推送技术 Tornado comet

long poll的原理是,客户端与服务器将建立一条长连接,也就是说,客户端会发出一个请求,而服务器,将阻塞请求,直到有数据需要传递,才会返回。 ...

SAE+python+Tornado+pyTenjin 的完整示例

python 简单易懂,Tornado 高效易学,pyTenjin 轻巧快速,SAE 安全稳定使用门槛低。现在把他们结合在一起做了一个可运行在SAE 上的完整示例。...

使用pyTenjin 缓存html 页面片段

pyTenjin 号称是世界上最快的模板引擎,支持在 html 文件里嵌入 python 代码,这功能其它模板引擎也有,但最重要的是 pyTenjin 模板引擎只有一个不到70K的单个文件,简单import 一下就可以使用。...

Tornado 搭建基于 WebSocket 的聊天服务

这年头 Python web 框架是有点泛滥了. 下面要介绍的是 facebook 的开源框架 tornado. 这东西比较简单, 而且自带 WebSocket 支持, 可以用它做个简单的聊天室. ...

Leave a Comment