据我所知,Tornado是一个同时包含服务器和框架功能的解决方案。在我看来,将Flask和Tornado结合使用就像添加另一层抽象(增加了额外开销)。人们为什么要将Flask和Tornado一起使用?有哪些优点呢?
我之前一直认为使用Flask和Tornado是愚蠢的,但实际上确实有意义。不过,这样做会增加复杂性;如果我可以选择,我只想使用Tornado,但如果您喜欢Flask,那么这种设置也可以。
据报道,Flask很好用,比Tornado更简单。然而,在生产环境中,Flask需要一个WSGI服务器(或者FCGI,但那更复杂)。将Tornado设置为WSGI服务器相当简单:
from tornado.wsgi import WSGIContainer
from tornado.httpserver import HTTPServer
from tornado.ioloop import IOLoop
from yourapplication import app
http_server = HTTPServer(WSGIContainer(app))
http_server.listen(5000)
IOLoop.instance().start()
在这种情况下,开发者只需要关注 Flask 应用程序。Tornado 只充当服务器的角色。
同时,也可以使用 Tornado 处理某些请求(例如 WebSockets ,这些请求与 WSGI 不兼容),并仍然以 Flask 为主要工作方式。理论上,您将获得 Flask 的简单性和 Tornado 的异步性能。
与其使用Apache作为服务器,您将使用Tornado(当然是作为阻塞服务器,因为WSGI的同步特性)。
根据各自的优点使用每个框架,但要注意混合使用并不总能获得你想要的性能提升。
例如,https://gist.github.com/andreif/6088558 这个基准测试会疑问哪种框架组合更快,你必须将其适应到你的主要用例上。在这个例子中,Flask + Tornado 无法提供预期的性能提升。