用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

在128M的VPS上配置mysql+Tornado+Nginx笔记

最近 123systems http://goo.gl/2Q0X2 又推出一年$10的便宜 VPS,128M内存,可以用来学习。在这样的vps 上放一个博客或做反向代理绰绰有余,买下后尝试配一个mysql+Tornado+Nginx 环境。...

tornado websocket 客户端与服务器端示例

最近在网上找了些websocket的资料看了下,node和tornado等等本身已经实现了websocket的封装,所以使用起来会比较简单,php如果想要写websocket还需要自己跑一整套流程,比较麻烦。...

Tornado 构建一个 Comet 应用

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

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

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

Leave a Comment