我编写了一个非常简单的龙卷风处理程序,用于测试远程部署的某些设备的上传速度。主要测试将在所述远程设备中运行(感谢cURL),我可以获得有关上传所用时间的详细报告。
Tornado处理程序唯一真正要做的就是接受一个具有多个字节的主体(这就是它)
class TestUploadHandler(tornado.web.RequestHandler):
def post(self):
logging.debug("Testing upload")
self.write("")
所以,上面的代码有效,但它有点......几乎可耻: - D 为了让它多一点...... showable ,我我想展示一些更有用的日志,比如请求上传的时间或类似的东西。我不知道......有点多汁的东西。
有没有办法测量Tornado处理程序本身的上传速度?我已经搜索了如何对Tornado处理程序进行基准测试,但我似乎能够找到的是不同Web服务器之间的性能比较。
提前谢谢。
答案 0 :(得分:1)
嗯,计算上传本身花了多长时间非常简单:
import time
class TestUploadHandler(tornado.web.RequestHandler):
def post(self):
logging.debug("Testing upload")
start = time.time()
self.write({})
end = time.time()
print "Time to write was {} seconds.".format(end-start)
如果您想在多个处理程序中使用它,您还可以将计时代码移动到装饰器:
from functools import wrap
import time
def timer(func):
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print 'Function took {} seconds'.format(end-start)
return ret
return wrapper
class TestUploadHandler(tornado.web.RequestHandler):
@timer
def post(self):
logging.debug("Testing upload")
self.write({})
修改强>
鉴于您正在尝试从服务器的角度衡量上传到服务器的时间,上述方法无法正常工作。看起来龙卷风最接近的是使用@tornado.web.stream_request_body
装饰器,以便您将请求体作为流接收:
@tornado.web.stream_request_body
class ValueHandler(tornado.web.RequestHandler):
def initialize(self):
self.start = None
def post(self):
end = time.time()
print self.request
if self.start:
print("Upload time %s" % end-self.start)
self.write({})
def data_received(self, data):
if not self.start:
self.start = time.time()
当收到请求正文的第一个块时,我们会节省时间(self.start
)。收到完整正文后,我们会立即调用post
方法,因此我们会获得end
。
但是我遇到了使大文件上传正常工作的问题。但它似乎适用于小文件(100MB以下)。