用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 websocket 客户端与服务器端示例

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

服务器推送技术 Tornado comet

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

Leave a Comment