英文: http://blog.wensheng.com/2011/10/performance-of-flask-tornado-gevent-and.htmlhtml
我在選一個python的互聯網框架, 原本已經定下來用Tornado了. 但我還聽到不少人推薦Flask的簡單性和靈活性, 還有gevent的高性能, 因此決定也試試它們以及它們和Tornado的結合. 個人示例就比」Hello World」應用稍微複雜一點兒, 它用到了模板. 下面是代碼:python
from flask import Flask, render_template
web
app = Flask(__name__)
@app.route('/')
def main_handler():
return render_template('main_j2.html', messages="whatever",title="home")
if __name__ == '__main__':
app.run(port=8888, debug=False)
import os.path
flask
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
服務器
def get(self):
self.render('main.html', page_title="", body_id="", messages="whatever",title="home")
settings = {
app
"static_path":os.path.join(os.path.dirname(__file__),'static'),
"template_path":"templates",
}
application = tornado.web.Application([
(r"/", MainHandler),
], **settings)
if __name__ == "__main__":
框架
application.listen(8888)
tornado.ioloop.IOLoop.instance().start()
from gevent.wsgi import WSGIServer
tornado
from pure_flask import app
http_server = WSGIServer(('', 8888), app)
http_server.serve_forever()
from tornado.wsgi import WSGIContainer
oop
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from pure_flask import app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(8888)
IOLoop.instance().start()
import tornado.wsgi
性能
import gevent.wsgi
import pure_tornado
application = tornado.wsgi.WSGIApplication([
(r"/", pure_tornado.MainHandler),
],**pure_tornado.settings)
if __name__ == "__main__":
server = gevent.wsgi.WSGIServer(('', 8888), application)
server.serve_forever()
Flask和Tornado用了不一樣的模板文件(Tornado是main.html, Flask是main_j2.html), 這是由於Flask和Tornado的模板語法雖然類似, 但有些地方不同. 好比Flask(用Jinja2)模板的」block」用」{% endblock %}」表示結束, 「for」用」{% endfor %}」; 可是Tornado模板則只用」{% end %}」.
我用ApacheBench測了這五個的requests per second:
ab -n 1000 -c 4 http://localhost:8888/
每一個測五次. 個人機型是6年老的雙核Opteron 254服務器.
pure_flask: 82 88 107 102 71
pure_tornado: 144 244 241 294 290
gevent_flask: 127 139 145 152 110
tornado_flask: 110 88 74 92 101
gevent_tornado: 328 555 177 273 153
五次平均:
pure_flask: 90
pure_tornado: 242
gevent_flask: 135
tornado_flask: 93
gevent_tornado: 297
從上面結果可能看出Tornado比Flask快不少. 而Gevent能夠讓Tornado更快一些, 但快不了不少.
最終我仍是喜歡Tornado應用的簡單明瞭, 用Flask寫稍微大一點的應用比較繁瑣(好比要使用藍圖-blueprints等), 因此仍是決定使用Tornado了