用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

服务器推送技术 Tornado comet

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

Tornado 构建一个 Comet 应用

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

使用pyTenjin 缓存html 页面片段

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

给SAEpy-log 添加了代码高亮

选择了一款很轻巧的js 代码高亮,一个32K的 highlight.min.js 和一个2K 的 themes css,你可以到[HIGHLIGHT.JS](http://softwaremaniacs.org/soft/highlight/en/) 官网看看。...

Leave a Comment