【发布时间】:2017-03-29 01:37:33
【问题描述】:
所以想用 Tornado 来实现一个简单的文件下载服务器。这是我目前拥有的代码:
class downloadHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
def get(self):
global data
self.write(data)
self.flush()
self.finish()
def get_buf(path):
buf = bytearray(os.path.getsize(path))
with open(path, 'rb') as f:
f.readinto(buf)
return bytes(buf)
if __name__ == '__main__':
data = get_buf('path/to/file')
tornado.options.parse_command_line()
app = tornado.web.Application(handlers=[(r"/upgrade", downloadHandler)])
http_server = tornado.httpserver.HTTPServer(app)
http_server.listen(options.port)
tornado.ioloop.IOLoop.instance().start()
如您所见,我将文件读入字节数组并将其转换为字节对象,这仅在启动服务器之前完成一次。我所做的只是将数据写入远程客户端。文件大小为 2MB。我用“围攻”测试它,结果看起来客户端是一个接一个地接收他们的数据,而不是以并发的方式。
siege http://xxx.xx.xx.xx:8000/upgrade -c5 -r1
** SIEGE 4.0.2
** Preparing 5 concurrent users for battle.
The server is now under siege...
HTTP/1.1 200 20.22 secs: 1969682 bytes ==> GET /upgrade
HTTP/1.1 200 34.24 secs: 1969682 bytes ==> GET /upgrade
HTTP/1.1 200 48.24 secs: 1969682 bytes ==> GET /upgrade
HTTP/1.1 200 62.24 secs: 1969682 bytes ==> GET /upgrade
HTTP/1.1 200 76.25 secs: 1969682 bytes ==> GET /upgrade
我检查了tornado文档,我认为self.write()是一个非阻塞调用,我调用了self.flush()。那么是什么阻止了服务器?
我也试过tornado.web.StaticFileHandler,结果差不多。
PS:tornado 是正确的工具吗?如果不是,还有哪些其他替代方法可以满足我的需求?
【问题讨论】:
标签: python concurrency tornado nonblocking