何时使用Tornado,何时使用Twisted/Cyclone/GEvent/other

Woj*_*ilo 181 python webserver twisted tornado gevent

哪些框架/库是构建现代多用户Web应用程序的最佳选择?我希望有一个异步的网络服务器,这将允许我轻松扩展.什么解决方案将提供最佳性能/可扩展性/最有用的框架(在易用性和易于开发方面)?

如果它能提供良好的功能(websockets,rpc,streaming等)会很棒.

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

dhi*_*iva 222

" Django是一个高级Python Web框架,它鼓励快速开发和干净,实用的设计".如果你正在构建类似于电子商务网站的东西,那么你应该选择Django.它将使您的工作快速完成.你不必担心太多的技术选择.它提供了从模板引擎到ORM所需的一切.关于你构建你的应用程序的方式会略有不同,如果你问我,这很好.它拥有所有其他图书馆中最强大的社区,这意味着可以获得简单的帮助.

" Flask是基于Werkzeug,Jinja 2和良好意图的Python的微框架".当心 - "微框架"可能会产生误导.这并不意味着Flask是一个半生不熟的图书馆.这意味着烧瓶的核心非常非常简单.与Django不同,它不会为您做出任何技术决定.您可以自由选择任何令您满意的模板引擎或ORM.即使它默认配备Jinja模板引擎,您也可以自由选择我们自己的模板引擎.据我所知,Flask在编写API端点(RESTful服务)时非常方便.

" Twisted是一个用python编写的事件驱动的网络引擎".这是一款高性能引擎.其速度的主要原因是称为延迟.Twisted建立在延迟之上.对于那些不了解deferred的人,它是通过异步架构实现的机制.扭曲非常快.但不适合编写传统的webapps.如果你想做一些低级网络的东西,twisted就是你的朋友.

" Tornado是一个Python Web框架和异步网络库,最初是在FriendFeed上开发的.通过使用非阻塞网络I/O,Tornado可以扩展到数万个开放连接,使其成为长轮询,WebSockets和其他应用程序的理想选择.这需要与每个用户建立长期联系".龙卷风站在Django和Flask之间.如果你想用Django或Flask写一些东西,但如果你需要更好的性能,你可以选择Tornado.如果它的架构正确,它可以很好地处理C10k问题.

" Cyclone是一个用于Python的Web服务器框架,它将Tornado API实现为Twisted协议".现在,如果你想要的东西几乎和Twisted一样高效但是很容易编写传统的webapps呢?跟旋风打个招呼吧.我更喜欢Cyclone而不是龙卷风.它的API与Tornado非常相似.事实上,这是龙卷风的一个分支.但问题是它具有相对较小的社区.Alexandre Fiori是回购的唯一主要提交者.

" Pyramid是一个通用的,开源的Python Web应用程序开发框架.它的主要目标是让Python开发人员更容易创建Web应用程序." 我还没有真正使用Pyramid,但是我浏览了文档.根据我的理解,金字塔非常类似于Flask,我认为你可以在Flask看起来合适的地方使用金字塔,反之亦然.

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

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

  • @FizerKhan:根据您的要求,我更新了答案.对不起,花了这么久.没有时间使用金字塔.但我浏览了文档. (5认同)

Gly*_*yph 60

这显然是一个有点偏颇的答案,但这与错误答案不同; 你应该总是使用Twisted.我以前回答过类似的问题,但由于你的问题不尽相同,这里有一些原因:

"最棒的表演"

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

"可扩展性"

据我所知,列出的框架都没有任何内置的自动缩放支持; 它们都是通信框架,因此您必须完成扩展节点之间的通信工作.但是,Twisted在内置支持本地多处理方面具有优势.公平地说,Tornado一个第三方附加组件,允许你做同样的事情.在最近的版本中,Twisted添加了一些功能,这些功能可以增加您在核心之间共享工作的方式,并且该领域的工作正在进行中.扭曲的也有一对夫妇的良好整合,"本土" RPC它提供了一个建筑套件,无论缩放成语你想追求的协议.

"最有用"

很多人似乎发现Twisted 非常有用. 这么多,以至于他们中的许多人已经扩展了它,并为您提供了扩展.

"功能"

开箱即用,Twisted包括:

在最后一个部门,至少,Twisted似乎是内置功能的明显赢家.所有这一切,在一个超过2兆字节的包中!

  • @remdezx关于你的问题,有两个原因.一个是人们发现Twisted很难理解,因为并发编程很难理解.然后他们切换到GEvent,因为它表面上很容易理解 - 只要没有并发性,一切都像你期望的那样工作.另一个原因是,将代码移植到GEvent上的工作要少得多,而不是使用事件驱动的API来编写,以获得事件驱动的I/O的性能优势.如果您的代码不共享太多状态,这样的端口可能正常工作. (8认同)
  • 为什么这么多人说他们不再使用Twisted,而是GEvent? (6认同)
  • 有很多人说使用 Twisted 维护大型应用程序很困难(因为它的回调架构):http://stackoverflow.com/questions/3048012/eventlet-or-gevent-or-stackless-twisted-pylons -django-and-sql-alchemy 使用 gevent 或基于 gevent 的 Twisted 不是更好吗? (2认同)
  • @ danilo2是的,你至少缺少一件事:).具体而言,您误解"并发"一词是指"在多个CPU上并发并行执行".Twisted可以通过异步(基于回调的)I/O进行并发I/O调度.GEvent可以通过微线程调度程序进行并发I/O调度.在Twisted中,使用`spawnProcess`,这个I/O调度也可以转换为CPU调度. (2认同)

Rob*_*mba 48

我喜欢@Glyph的回复.Twisted是非常全面,丰富的python框架.Twisted和Tornado的设计非常相似.而且我非常喜欢这个设计:

  • 它很快
  • 容易明白
  • 容易扩展
  • 不需要c扩展名
  • 适用于PyPy.

但我想强调龙卷风,我更喜欢并最近获得人气.像Twisted一样,Tornado使用回调样式编程,但可以使用tornado.gen.engine(twisted.internet.inlineCallbacks在Twisted中)内联.

代码库

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

Twisted是公众可用的非阻塞I/O最成熟的库之一.Tornado是FriendFeed的Web服务器的开源版本,它是Python最流行和最快速的Web服务器之一,具有用于构建Web应用程序的非常好的API.

我们的想法是将Tornado优雅而直接的API与Twisted的Event-Loop联系起来,从而实现大量支持的协议.

但在2011 tornado.platform.twisted年出局带来了类似的功能.

性能

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

可扩展性

像Twisted一样.Tornado已经tornado.process实现了很多rpc服务.

功能

有71个龙卷风包,而148个Twisted和48个Gevent.但是如果你仔细观察并计算包装上传时间的中位数,你会看到Twisted的是最老的,然后是最新鲜的Gevent和Tornado.此外,还有一个tornado.platform.twisted模块允许您运行为Tworn on Tornado编写的代码.

摘要

使用Tornado,您可以使用Twisted代码.没有必要使用只能扭曲代码的旋风(你的代码变得更加混乱).

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

我写了一篇文章,解释了为什么我认为Tornado - 最好的Python Web框架,我写了很多关于Tornado功能的文章.


Eri*_*lun 15

(更新:我很惊讶这里几乎没有答案推荐甚至提到Gevent-我不认为它与这个优秀的图书馆的受欢迎程度,性能和易用性成正比!)

Gevent和Twisted并不是相互排斥的,尽管起初相反可能看起来很明显.有一个项目叫做geventreactor允许人们相对平稳地利用这两个领域的优势,即:

  • Gevent的高效便宜(合作绿色)线程模型,在并发性方面更容易编程 - 坦率地说,Twisted's inlineCallbacks在许多协同程序方面根本不能胜任工作,而且在易用性/透明度方面:yieldDeferreds无处不在; 通常很难建立一些抽象; 可怕的无用堆栈跟踪,无论是裸露还是裸露Deferred,甚至更多@inlineCallbacks.
  • Twisted的所有内置功能都是您梦寐以求的,包括但不限于IReactorProcess.spawnProcess.

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

我目前的布局可以让我在GEVENT的不错的编程模型,并利用编程的东西,如一个无阻塞socket,urllib2和其他模块.我可以使用常规的Python代码来做常规的事情,而不是学习曲线和使用Twisted方式做简单的基本事情的不便.我也可以轻松使用大多数第三方库,这些库通常与Twisted无关,或者需要使用线程.

我还可以通过使用greenlets(而不是Deferreds和回调,和/或@inlineCallbacks)完全避免笨拙且经常过于复杂的基于回调的编程.

(这个答案是根据我在现实生活中使用Twisted和Gevent的个人经验编写的,使用Twisted的经验非常多(但我并不认为是Twisted专家).我必须编写的软件没有不得不使用Twisted的很多功能,所以根据你需要Twisted的功能集,混合Gevent和Twisted的(相对无痛的)额外复杂性可能不值得麻烦.)