为什么要同时使用Tornado和Flask?

43
据我所知,Tornado是一个同时包含服务器和框架功能的解决方案。在我看来,将Flask和Tornado结合使用就像添加另一层抽象(增加了额外开销)。人们为什么要将Flask和Tornado一起使用?有哪些优点呢?

2
看这个;)https://github.com/twisted/klein - Jakob Bowyer
4个回答

64
根据这个问题,Flask是阻塞的,而Tornado是非阻塞的。
如果使用Tornado作为WSGI服务器,并使用Flask进行URL路由和模板(未记录),则不应该有任何开销。使用这种方法时,您不使用Flask的Web服务器,因此没有额外的抽象层。
但是,如果仅使用Flask进行模板,则可以使用Jinja2与Tornado一起使用,Jinja2是Flask使用的模板引擎。

23

我之前一直认为使用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 的异步性能。


6
我理解你的意思是,除非我弄错了,否则在Flask应用程序中阻塞活动仍会干扰和挂起Tornado反应器,是吗? - DeaconDesperado
3
没错,Flask会阻塞。但如果你在不同的服务器上运行它,这并不会改变。 - Cole Maclean
2
我完全放弃了Flask和UWSGI,只使用Mako模板。加入Mako只需要大约30行代码,现在我有路由、处理程序和模板(这基本上就是框架的全部)。我的应用程序由supervisord管理,一切都完成并运行良好,没有Flask的余地。 - 3k-

2

与其使用Apache作为服务器,您将使用Tornado(当然是作为阻塞服务器,因为WSGI的同步特性)。


3
如果这是真的,那么使用Tornado而不是同样是阻塞式的Flask web服务器有什么意义呢?你确定在这种情况下Tornado也是阻塞式的吗? - Zelphir Kaltstahl

0

根据各自的优点使用每个框架,但要注意混合使用并不总能获得你想要的性能提升。

例如,https://gist.github.com/andreif/6088558 这个基准测试会疑问哪种框架组合更快,你必须将其适应到你的主要用例上。在这个例子中,Flask + Tornado 无法提供预期的性能提升。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接