Tornado 异步性能分析
Tornado 是一个 Python web 框架和异步网络库,起初由 FriendFeed 开发。通过使用非阻塞网络 I/O,Tornado 可以支撑上万级的连接,处理长连接, WebSockets ,和其他需要与每个用户保持长久连接的应用。
本文介绍如何正确的使用 tornado 异步特性以及对其进行压力测试, 查看 tornado 的性能到底有多强悍。
本文使用 tornado 5.0.2 版本。
一、最简单的脚手架
创建 server.py 文件,写入以下代码
# -*- coding: utf-8 -*-
import tornado.ioloop
import tornado.web
class Index(tornado.web.RequestHandler):
def get(self):
self.write("hello world")
def make_app():
return tornado.web.Application([
(r"/", Index)
])
if __name__ == '__main__':
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
最简单的代码,可以先将服务启动. 在浏览器中输入 http://127.0.0.1:8888 即可看到 hello world 页面
我使用 jmeter 进行压测,可以达到 1200,可以说是非常不错
二、同步的困扰
但是在开发过程中并不是所有的接口都什么都不做就返回个简单的字符串或者 json, 更多的时候是进行一些数据库的操作或者本地的 IO 操作之后再返回相应的数据。
我们知道,程序在进行 IO 操作时,无论是网络 IO 或者文件的读写 IO,与内存计算相比,耗时是非常大的,此时我们如果模拟一个比较耗时的操作,那么这个接口 QPS 还会那么好吗?
class Index(tornado.web.RequestHandler):
def get(self):
name = self.get_argument('name', 'ge