何时使用龙卷风,何时使用Twisted / Cyclone / GEvent /其他[关闭]


181

以下哪个框架/库是构建现代多用户Web应用程序的最佳选择?我很想拥有一个异步Web服务器,这将使我可以轻松扩展。哪种解决方案将提供最佳的性能 / 可伸缩性 / 最有用的框架(就易于使用和易于开发而言)?

如果它将提供良好的功能(websockets,rpc,流式传输等),那就太好了。

每个解决方案的优缺点是什么?


是否需要成为这些框架之一?您打算做什么,并且可以使用Django,Pylons等之类的工具?
Joe Doherty

不,不重要,但是我希望它是异步的,并且会对websocket提供良好的支持-我也更新了这个问题。谢谢。
Wojciech Danilo

3
是一个广泛的问题,不是吗?
Jean-Paul Calderone

您的选择取决于要使用的库。您的库-在任务上要解决。
Nikolay Fominyh,2012年

1
是的,它很广泛,但也许可以解决。我想知道这些库是否用于生产中,并且每天使用其中一些库的人能够告诉他们它们的优点,不足之处等。选择库的基准应该是什么?也许Twisted应该是在谈论高速公路或旋风时折旧了吗?还是mmaybe高速公路和Cyclone尚未做好生产准备,并且其维护受到质疑?也许龙卷风拥有更现代的设计,它的未来可能会光辉灿烂,应该成为启动项目的选择?
Wojciech Danilo

Answers:


226

Django是一个高级Python Web框架,它鼓励快速开发和简洁实用的设计”。如果您要构建类似于电子商务站点的内容,则可能应该使用Django。它将使您的工作迅速完成。您不必担心太多的技术选择。它提供了从模板引擎到ORM所需的一切。对于您构建应用程序的方式,我们会有些怀疑,如果您问我,这很好。它具有所有其他图书馆中最强大的社区,这意味着可以轻松获得帮助。

Flask是基于Werkzeug,Jinja 2和良好意图的Python微框架”。当心-“微框架”可能会产生误导。这并不意味着Flask是一个半熟的库。这意味着烧瓶的核心非常非常简单。与Django不同,它将不会为您做出任何技术决策。您可以自由选择任何令您满意的模板引擎或ORM。即使默认情况下它带有Jinja模板引擎,您仍然可以自由选择我们自己的。据我所知,Flask可用于编写API端点(RESTful服务)。

Twisted是一个用python编写的事件驱动的网络引擎”。这是高性能的引擎。其速度的主要原因是所谓的延迟。Twisted建立在延期之上。对于那些不了解延迟的人来说,这是通过异步体系结构实现的机制。扭曲非常快。但是不适合编写常规的Webapp。如果您想做一些底层的网络工作,那么twisted是您的朋友。

Tornado是一个Python Web框架和异步网络库,最初是由FriendFeed开发的。通过使用非阻塞网络I / O,Tornado可以扩展到成千上万的开放连接,使其非常适合长时间轮询,WebSocket和其他应用程序需要与每个用户建立长期连接”。龙卷风位于Django和Flask之间。如果您想用Django或Flask编写东西,但是如果您需要更好的性能,则可以选择Tornado。如果架构正确,它可以很好地处理C10k问题。

Cyclone是用于Python的Web服务器框架,它实现了Tornado API作为Twisted协议的实现”。现在,如果您想要具有与Twisted差不多的性能但易于编写的常规Web应用程序,该怎么办?向飓风打个招呼。我更喜欢飓风而不是龙卷风。它具有与Tornado非常相似的API。实际上,这是龙卷风的叉子。但是问题是它的社区相对较小。Alexandre Fiori是回购协议的唯一主要提交者。

Pyramid是一个通用的开源Python Web应用程序开发框架。其主要目标是使Python开发人员更轻松地创建Web应用程序。” 我并没有真正使用过金字塔,但是我浏览了文档。据我了解,金字塔与Flask非常相似,我认为您可以在任何地方使用金字塔 Flask合适的,反之亦然。

编辑:欢迎要求审查任何其他框架!

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


1
Django是我偏爱的框架。它的文档非常好,ORM很简单。South非常适合数据库模式迁移...。但问题包含以下内容:“我希望拥有一个异步Web服务器,该服务器可以使我轻松进行扩展。” Django是为经典的请求+响应网站而不是异步网站而设计的。
guettli 2013年

1
你能写有关金字塔的文章吗?
Fizer Khan 2014年

5
@FizerKhan:根据您的要求,我更新了答案。抱歉,花了这么长时间。没有时间使用金字塔。但是我浏览了文档。
dhilipsiva 2014年

1
我还要补充说,Tornado使用的单线程环境更容易发生错误-一个使单个API端点的代码变慢的错误很容易导致所有端点的问题。
亚伯·莫利纳

1
您能对cherrypy发表评论吗?
Stavros Avramidis

60

这显然是一个有偏见的答案,但这与错误的答案不同。您应该始终使用Twisted。我之前也回答过类似的问题,但是由于您的问题并不完全相同,因此有一些原因:

“最棒的表演”

Twisted在speed.twistedmatrix.com网站上持续监控我们的表现。我们也是PyPy的类似网站监控的首批项目之一,从而确保Twisted在运行时的良好性能,这是任何关注Python中高性能应用程序的人的。

“可伸缩性”

据我所知,列出的框架都没有内置的自动缩放支持。它们都是通信框架,因此您必须进行工作以在扩展节点之间进行通信。但是,Twisted在其对本地多处理的内置支持方面具有优势。公平地说,Tornado一个第三方加载项,使您可以执行相同的操作。在最新发行版中,Twisted添加了功能,这些功能增加了内核之间共享工作的方式数量,并且该领域的工作正在进行中。扭曲的也有一对夫妇的良好整合“本土” RPC它提供了一个建筑套件,无论缩放成语你想追求的协议。

“最有用”

很多人似乎发现Twisted 非常有用如此之多,以至于其中许多人都对其进行了扩展,并向您提供了其扩展名。

“功能”

开箱即用,Twisted包括:

至少在最后一个部门中,Twisted似乎是内置功能的明显赢家。而这一切,仅需2兆字节即可!


6
为什么这么多人说他们不再使用Twisted,而是GEvent?
remdezx 2012年

1
很多人告诉我们,使用Twisted很难维护大型应用程序(由于其回调体系结构):stackoverflow.com/questions/3048012/… 使用基于gevent或基于gevent的Twisted会更好吗?
Wojciech Danilo

8
@remdezx关于您的问题,有两个原因。一种是人们很难理解Twisted,因为并发编程很难理解。然后,他们切换到GEvent,因为它从表面上很容易理解-只要没有并发,一切都会按照您的期望进行。另一个原因是,将代码移植到未使用事件驱动的API来获取事件驱动的I / O的性能优势的GEvent上的工作要少得多。如果您的代码没有共享太多状态,则此端口可能工作正常。
Glyph

1
@Glyph,您在谈论并发,但是... Gevent和Twisted都不支持并发(当然,您可以对gevent使用多处理,并在每个线程上使用实际线程池和greenlets池-这对我和您可以使用Twisted插件执行完全相同的操作-彼此相邻运行多个Twisted实例)。但是,Twisted吉吉斯给您带来的不仅仅是精神上的欢乐吗?我认为,即使有多个gevent / twisted实例,没有显式的io回调,gevent也更容易被盗用。我想念什么吗?
Wojciech Danilo

2
@ danilo2是的,您至少缺少一件事:)。具体来说,您误解了“并发”一词,意思是“在多个CPU上并行并行执行”。Twisted可以通过异步(基于回调)的I / O进行并发I / O调度。GEvent可以通过微线程调度程序执行并发I / O调度。在Twisted中,使用spawnProcess,该I / O调度也可以转换为CPU调度。
Glyph

48

我喜欢@Glyph回复。Twisted非常全面,丰富的python框架。Twisted和Tornado具有非常相似的设计。我非常喜欢这种设计:

  • 它很快
  • 容易理解
  • 易于扩展
  • 不需要 c扩展名
  • 在PyPy上工作。

但是,我想强调Tornado,我更喜欢它,最近又变得流行。与Twisted类似,Tornado使用回调样式编程,但是可以使用tornado.gen.enginetwisted.internet.inlineCallbacks在Twisted中)。

程式库

最佳评论来自http://cyclone.io网站。气旋试图混合扭曲和龙卷风,因为:

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

这个想法是将Tornado优雅而直接的API桥接到Twisted的Event-Loop,从而实现大量受支持的协议。

但是在2011年 tornado.platform.twisted年问世,它带来了类似的功能。

性能

龙卷风有更好的表现。它还可以与PyPy无缝协作,并获得巨大收益。

可扩展性

像扭曲一样。龙卷风有tornado.process在其上实现了许多rpc服务。

功能性

有71种基于Tornado的软件包,而148种Twisted和48 Gevent的软件包。但是,如果仔细查看并计算软件包上载时间的中位数,您会发现Twisted最早,而Gevent和Tornado最新鲜。此外,还有一个tornado.platform.twisted模块,允许您运行为Twisted on Tornado编写的代码

摘要

使用Tornado,您可以使用Twisted中的代码。无需使用只会扭曲的旋风分离器您的代码的(您的代码会变得更加混乱)。

至于2014年,Tornado被认为是广泛接受的默认异步框架,可同时在python2和python3上使用。另外,最新版本4.x带来了https://docs.python.org/dev/library/asyncio.html中的许多功能。

我写了一篇文章,解释了为什么我认为Tornado是最好的Python Web框架,在那里我写了很多有关Tornado功能的信息。


15

更新:我对这里推荐甚至提到Gevent的答案很少感到惊讶,我认为这与这个出色的库的受欢迎程度,性能和易用性不成比例!)

Gevent和Twisted并不是互斥的,尽管乍一看似乎相反。有一个名为的项目geventreactor,可以使人们相对平稳地利用两全其美的优势,即:

  • Gevent的高效,廉价(绿色协作)线程模型,在并发方面更容易编程—坦率地说,inlineCallbacks对于许多协同程序,Twisted的性能根本无法胜任,在易用性/透明度方面: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(而不是Deferreds和callbacks和/或@inlineCallbacks)完全避免笨拙且通常过于复杂的基于回调的编程。

(此答案是根据我在现实生活项目中同时使用Twisted和Gevent的个人经验编写的,并且使用Twisted的经验也很多(但我并没有声称自己是Twisted专家)。我必须编写hasn的软件不必使用Twisted的太多功能,因此根据Twisted所需的功能集,混合Gevent和Twisted的(相对轻松)额外的复杂性可能不值得。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.