【问题标题】:Why use Tornado and Flask together?为什么要同时使用 Tornado 和 Flask?
【发布时间】:2012-10-21 06:25:57
【问题描述】:

据我所知,Tornado 是一个服务器和一个框架。在我看来,一起使用 Flask 和 Tornado 就像添加另一个抽象层(更多开销)。人们为什么要同时使用 Flask 和 Tornado,有什么好处?

【问题讨论】:

标签: python web webserver flask tornado


【解决方案1】:

根据this question,这是因为 Flask 是阻塞的,而 Tornado 是非阻塞的。

如果使用Tornado as a WSGI server and Flask for url routing + templates,则不应该有任何开销。使用这种方法,您不会使用 Flask 的 Web 服务器,因此实际上并没有额外的抽象层。

但是,如果有人将 Flask 仅用于模板,他们可以将 Tornado 与 Jinja2 一起使用,这是 Flask 使用的模板引擎。

【讨论】:

    【解决方案2】:

    我一直认为将 Flask 和 Tornado 一起使用是愚蠢的,但它确实是有道理的。但它增加了复杂性;我的偏好是只使用 Tornado,但如果你连接到 Flask,那么这个设置就可以了。

    Flask(据报道)非常好用,而且比 Tornado 更简单。但是,Flask requires a WSGI server for production(或 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 的异步性能。

    【讨论】:

    • 除非我弄错了,否则阻止 Flask 应用程序中的活动仍然会中断并挂起 Tornado 反应器,对吧?
    • 是的,Flask 会阻塞。但是如果你在不同的服务器上运行它并不会改变。
    • 我完全放弃了 Flask 和 UWSGI,只使用 Mako 模板。合并 Mako 需要大约 30 行代码,所以现在我有了路由、处理程序和模板(这几乎就是框架)。我的应用由 supervisord 管理,一切正常,运行良好,没有 Flask 的空间。
    【解决方案3】:

    您将使用 Tornado,而不是使用 Apache 作为您的服务器(由于 WSGI 的同步特性,当然作为阻塞服务器)。

    【讨论】:

    • 但如果这是真的,那么使用 Tornado 而不是同样阻塞的 Flask Web 服务器又有什么意义呢?您确定 Tornado 在这种情况下会被阻止吗?
    【解决方案4】:

    将每一种都用于更擅长的领域,但要考虑到混合使用并不总能获得您想要的性能提升。

    这个基准测试,https://gist.github.com/andreif/6088558,例如,质疑哪种框架组合更快,您必须使示例适应您的主要用例。在这个例子中,flask+tornado 没有提供预期的性能提升。

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2011-12-29
      • 1970-01-01
      • 2013-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-07-14
      • 1970-01-01
      • 2017-10-16
      相关资源
      最近更新 更多