据我所知,Tornado 是一个服务器和一个框架。在我看来,一起使用 Flask 和 Tornado 就像添加另一个抽象层(更多开销)。为什么人们一起使用 Flask 和 Tornado,有什么优势?
4 回答
根据这个问题,这是因为 Flask 是阻塞的,而 Tornado 是非阻塞的。
如果使用Tornado 作为 WSGI 服务器,使用 Flask 作为 url 路由 + 模板,则不应该有任何开销。使用这种方法,您不会使用 Flask 的 Web 服务器,因此实际上并没有额外的抽象层。
但是,如果一个人只是将 Flask 用于模板,他们可以将 Tornado 与Jinja2一起使用,这是 Flask 使用的模板引擎。
我一直认为将 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 的异步性能。
您将使用 Tornado(当然,由于 WSGI 的同步特性而作为阻塞服务器),而不是使用 Apache 作为您的服务器。
将每一种都用于更擅长的领域,但要考虑到混合并不总能获得您正在寻找的性能提升。
例如,此基准测试https://gist.github.com/andreif/6088558质疑哪种框架组合更快,您必须使示例适应您的主要用例。在这个例子中,flask+tornado 没有提供预期的性能提升。