在PHP 程序里面经常在页脚看到这些服务器响应时间,在Tornado 下也好实现。
效果参见本站页脚,本站已启用 Memcache 来保存html ,所看到的响应时间是首次响应时间。
源码
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 转摘请注明来源