何时使用Tornado,何时使用Twisted / Cyclone / GEvent / 其他

184
哪个框架/库是构建现代多用户Web应用程序的最佳选择?我希望拥有一个异步Web服务器,以便我可以轻松扩展。哪种解决方案能够提供最佳性能/可伸缩性/最有用的框架(易于使用和开发)?如果它能提供良好的功能(Websockets,RPC,流等),那就太好了。每种解决方案的优缺点是什么?

需要使用这些框架之一吗?您计划做什么,像Django、Pylons等框架是否可行? - Joe Doherty
不,当然不是,但我希望它是异步的,并且对Websockets有很好的支持 - 我也更新了问题。谢谢。 - Wojciech Danilo
3
这是一个比较笼统的问题,不是吗? - Jean-Paul Calderone
1
是的,这个问题比较广泛,但也许可以解决。我想知道这些库是否在生产中使用,是否有人每天都在使用它们,并能够告诉它们的优点、缺点等等。选择库的基线应该是什么 - 当谈到Autobahn或Cyclone时,也许Twisted应该被视为过时了?或者Autobahn和Cyclone还没有准备好投入生产,其维护是否存在疑问?或者Tornado具有更现代的设计,未来可能会更加出色,应该成为创业项目的首选? - Wojciech Danilo
有一些微框架,比如Flask、CherryPy和Bottle。 - ealeon
显示剩余2条评论
4个回答

232

"Django是一个高级的Python Web框架,鼓励快速开发和干净、实用的设计"。如果你正在构建类似于电子商务网站的东西,那么你应该选择Django。它可以快速完成您的工作,您不必担心太多的技术选择。它提供了从模板引擎到ORM所需的一切。它会对您构建应用程序的方式进行轻微的偏见,这对我来说是好事。而且它拥有所有其他库中最强大的社区,这意味着可以轻松获取帮助。

"Flask是一个基于Werkzeug、Jinja 2和良好意图的Python微框架"。请注意,“微框架”可能会误导您。这并不意味着Flask是一个草率的库。这意味着Flask的核心非常简单。与Django不同,它不会为您做出任何技术决策。您可以自由选择任何模板引擎或ORM。即使它默认使用Jinja模板引擎,您也可以随时选择自己的模板引擎。据我所知,Flask非常适合编写API端点(RESTful服务)。

"Twisted是一个用Python编写的事件驱动网络引擎"。这是一个高性能的引擎。它之所以快速,主要是因为有一种称为deferred的东西。Twisted是建立在deferred之上的。对于那些不了解deferred的人来说,它是实现异步架构的机制。Twisted非常快。但它不适合编写传统的Web应用程序。如果您想做一些低级网络操作,则可以使用Twisted。

"Tornado是一个Python web框架和异步网络库,最初由FriendFeed开发。通过使用非阻塞的网络I/O,Tornado可以扩展到数万个打开的连接,非常适合需要与每个用户保持长连接的应用程序,如长轮询、WebSockets等。" Tornado位于Django和Flask之间。如果你要用Django或Flask编写什么,但需要更好的性能,可以选择Tornado。如果它被正确地架构,它可以很好地处理C10k问题。

"Cyclone是一个Python Web服务器框架,它将Tornado API实现为Twisted协议"。现在,如果你想要一些几乎和Twisted一样高效但易于编写传统的Web应用程序呢?那就来试试Cyclone吧。我更偏向于Cyclone而不是Tornado。它有一个非常类似Tornado的API。事实上,这是Tornado的一个分支。但问题是它的社区相对较小。Alexandre Fiori是唯一的主要提交者。

"Pyramid是一个通用的、开源的Python Web应用程序开发框架。它的主要目标是使Python开发人员更容易地创建Web应用程序"。我没有真正使用过Pyramid,但我看了文档。从我的理解来看,Pyramid非常类似于Flask,我认为你可以在任何Flask适用的地方使用Pyramid,反之亦然。

编辑: 欢迎评价其他框架!

来源: http://dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html

这篇文章介绍了 Python Web 开发中五个流行的框架,包括 Django、Twisted、Tornado、Flask、Cyclone 和 Pyramid。这些框架在不同的场景下都有自己的优势和适用性。


1
Django是我首选的框架。它的文档非常好,ORM易于使用。South用于数据库模式迁移非常棒... 但问题在于:“我想拥有一个异步Web服务器,可以让我轻松扩展”。Django专为传统的请求+响应站点而设计,并不适用于异步操作。 - guettli
1
你能写一下关于Pyramid的内容吗? - Fizer Khan
5
根据您的要求,我更新了回答。很抱歉耽误了这么长时间。我没有时间使用Pyramid,但是我仔细查阅了文档。 - dhilipsiva
1
我要补充一点,Tornado 使用的单线程环境更容易出现漏洞 - 如果在单个 API 端点的代码中犯了一个错误导致速度变慢,这很容易会对所有端点造成问题。 - Abel Molina
1
你能对CherryPy发表一下评论吗? - Stavros Avramidis
显示剩余11条评论

64

这显然是一个有些偏颇的答案,但这并不等同于错误的答案;你应该始终使用Twisted。我之前回答过类似的问题,但由于你的问题并不完全相同,所以这里有一些原因:

"最佳性能"

Twisted在speed.twistedmatrix.com网站上持续监控我们的性能。我们也是第一个被PyPy类似网站监测的项目之一,从而确保了Twisted在任何关心Python高性能应用程序的运行时上具有良好的性能。

"可扩展性"

据我所知,这些列出的框架都没有内置自动缩放支持;它们都是通信框架,因此您需要做一些工作来在缩放节点之间进行通信。然而,Twisted 在其 内置本地多进程支持方面具有优势。公平地说,Tornado 有一个第三方插件可以让您执行相同的操作。在最近的版本中,Twisted 添加了功能,增加了您可以在核心之间共享工作的方式数量,并且该领域的工作正在进行中。Twisted 还有几个良好集成的, "本地"RPC协议,为您追求任何缩放习语提供了一个构建工具包。

许多人似乎发现Twisted非常有用以至于他们中的许多人已经扩展了它,并使他们的扩展可供您使用。

"功能性"

开箱即用,Twisted包括:

在至少这个部门中,Twisted 似乎是内置功能的明显赢家。而且所有这一切,只需一个略大于2兆字节的软件包!

7
为什么有这么多人说他们不再使用Twisted,而是改用GEvent了? - remdezx
2
有很多人说使用Twisted(因为其回调架构)来维护大型应用程序很困难:https://dev59.com/OnA75IYBdhLWcg3w49YR 使用基于gevent的Twisted不是更好吗? - Wojciech Danilo
9
关于你的问题,有两个原因。其中一个是人们认为Twisted难以理解,因为并发编程很难理解。他们转而使用GEvent,因为它表面上很容易理解——只要没有并发,一切都像你预期的那样工作。另一个原因是将没有使用事件驱动API编写的代码移植到GEvent要少得多的工作量,以获得事件驱动I/O的性能优势。如果你的代码没有共享太多状态,这样的移植可能会很好地工作。 - Glyph
1
@Glyph,你在谈论并发,但是...无论是Gevent还是Twisted都不支持并发(当然你可以使用multiprocessing和gevent一起使用,并在每个线程上使用真实线程和greenlets池-这对我来说很好用,你也可以使用Twisted插件来做完全相同的事情-在彼此旁边运行多个扭曲实例)。但是Twisted比gevent提供了更多的东西吗?我认为即使使用多个gevent/twisted实例,gevent更容易理解,而无需其显式io回调。我有什么遗漏的吗? - Wojciech Danilo
2
@danilo2 是的,你至少缺少了一件事 :). 具体来说,你误解了“并发”这个词的含义,认为它意味着“在多个 CPU 上进行并行执行”。Twisted 可以通过异步(基于回调的)I/O 进行并发 I/O 调度。GEvent 可以通过微线程调度程序进行并发 I/O 调度。在 Twisted 中,使用 spawnProcess,这种 I/O 调度也可以转换为 CPU 调度。 - Glyph
显示剩余8条评论

50

我喜欢@Glyph的回答。 Twisted是一个非常全面、丰富的Python框架。 Twisted和Tornado有着非常相似的设计,而我非常喜欢这种设计:

  • 速度快
  • 易于理解
  • 易于扩展
  • 不需要c扩展
  • 可以在PyPy上运行。

但我想要强调的是Tornado,它更受欢迎,最近也变得越来越流行。 Tornado和Twisted一样使用回调式编程,但可以使用tornado.gen.engine(Twisted中的twisted.internet.inlineCallbacks)进行内联。

代码库

最好的评论来自http://cyclone.io网站。cyclone试图混合Twisted和Tornado,因为:

Twisted是公共可用的最成熟的非阻塞I/O库之一。Tornado是FriendFeed的Web服务器的开源版本, 它是Python中最受欢迎和快速的Web服务器之一,并具有非常不错的构建Web应用程序的API。

其思想是将Tornado的优雅和简单的API与Twisted的事件循环桥接起来,从而支持大量协议。

但是在2011年,tornado.platform.twisted已经出现,带来了类似的功能。

性能

Tornado有更好的性能。它也与PyPy无缝协作,并获得巨大的收益。

可扩展性

与Twisted一样。Tornado具有tornado.process和很多基于它的rpc服务。

功能

有71个基于Tornado的包,相比之下,Twisted有148个,Gevent有48个。但如果你仔细观察并计算软件包上传时间的中位数,你会发现Twisted的最老,然后是Gevent,Tornado是最新的。 此外,还有tornado.platform.twisted模块,它允许您在Tornado上运行为Twisted编写的代码。

摘要

使用Tornado,您可以使用来自Twisted的代码。没有必要使用Cyclone,它只会使您的代码变得更混乱。

截至2014年,Tornado被认为是广泛接受和默认的异步框架,可在Python2和Python3上工作。此外,最新版本4.x带来了很多来自https://docs.python.org/dev/library/asyncio.html的功能。

我写了一篇文章,解释了我为什么认为Tornado - 最佳的Python Web框架,其中我写了更多关于Tornado功能的内容。


16

(更新:我很遗憾地惊讶于这里有多少答案推荐或甚至提到了 Gevent - 我认为这与这个优秀的库的流行度、性能和易用性不成比例!)

Gevent 和 Twisted 并不是互斥的,尽管相反可能一开始看起来更明显。有一个名为 geventreactor 的项目,它允许相对平稳地利用两个世界的最佳方面,即:

  • Gevent 的高效和廉价(协作式绿线程)模型,在并发编程方面要容易得多 - 坦白地说,Twisted 的 inlineCallbacks 在处理许多协程时表现性能不够好,而且在使用上也不够简单/透明:到处都是 yieldDeferreds;往往难以构建某些抽象;使用裸的 Deferred 或者更多地使用 @inlineCallbacks 时,堆栈跟踪非常无用。
  • 您可以梦想中的所有 Twisted 内置功能,包括但不限于 IReactorProcess.spawnProcess

我个人目前使用的是Gevent 1.0rc2与Twisted 12.3配合使用,并通过 geventreactor 桥接。我已经实现了自己尚未发布的 geventreactor 添加和增强功能,希望很快可以作为 geventreactor 的原始GitHub存储库的一部分发布:https://github.com/jyio/geventreactor

我的当前布局允许我使用Gevent的良好编程模型,并利用如非阻塞socketurllib2和其他模块等功能。我可以使用常规的Python代码来完成常规任务,而不必像Twisted那样学习曲线陡峭且不方便地执行甚至简单的基本任务。我还可以轻松地使用大多数第三方库,这些库通常在Twisted中要么无法使用,要么需要使用线程。

我也可以完全避免使用回调函数进行基于回调的编程时可能出现的尴尬和过于复杂的情况,而是使用greenlets(而不是Deferred和回调函数以及/或@inlineCallbacks)。

(这篇答案基于我在实际项目中使用Twisted和Gevent的个人经验,其中对Twisted的使用经验更为丰富(但我不自称是Twisted专家)。我所编写的软件没有使用太多Twisted的功能,因此根据您对Twisted所需功能的要求,混合使用Gevent和Twisted的(相对较少的)额外复杂性可能不值得麻烦。)


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