何时使用Tornado,何时使用Twisted / Cyclone / GEvent /其他
哪个框架/库将成为构build现代多用户Web应用程序的最佳select? 我很想有一个asynchronous的networking服务器,这将允许我轻松地扩展。 什么解决scheme会提供最好的性能 / 可扩展性 / 最有用的框架 (易于使用和易于开发)?
如果它能提供良好的function (websocket,rpc,streaming等),那将是一件好事。
每个解决scheme的优缺点是什么?
“ Django是一个鼓励快速开发和干净,实用的devise的高级Python Web框架” 。 如果您正在构build与电子商务网站类似的内容,那么您应该使用Django。 这将使您的工作快速完成。 你不必担心太多的技术select。 它提供了从模板引擎到ORM所需的一切。 如果你问我,会对你的应用程序构造方式稍作斟酌,这很好。 它拥有所有其他图书馆中最强大的社区,这意味着可以提供简单的帮助。
“ Flask是基于Werkzeug,Jinja 2和良好意图的Python的微框架” 。 当心 – “微型框架”可能会引起误解。 这并不意味着Flask是一个半熟的库。 这意味着烧瓶的核心非常非常简单。 不像Django,它不会为你做任何技术决定。 你可以自由select任何模板引擎或ORM让你满意。 即使它默认带有Jinja模板引擎,你总是可以自由select我们自己的。 就我所知,Flask适合编写API端点(RESTful服务)。
“ Twisted是一个用python编写的事件驱动的networking引擎” 。 这是一个高性能的引擎。 其速度的主要原因是所谓的延期。 扭曲是build立在延期之上的。 对于那些不了解防守的人来说,它是通过与asynchronous架构的机制来实现的。 扭曲非常快。 但是不适合写传统的webapps。 如果你想做一些低级的networking事情,扭曲是你的朋友。
“ Tornado是一个Python Web框架和asynchronousnetworking库,最初是在FriendFeed开发的,通过使用非阻塞networkingI / O,Tornado可以扩展到数以万计的开放连接,非常适合长轮询,WebSockets和其他应用程序这需要每个用户长期连接“ 。 龙卷风站在Django和Flask之间。 如果你想用Django或Flask写一些东西,但是如果你需要更好的性能的话,你可以selectTornado。 它可以很好地处理C10k问题,如果它的架构是正确的。
“ Cyclone是一个Python的Web服务器框架,它将Tornado API作为Twisted协议实现 。” 现在,如果你想要的东西几乎和Twisted一样,但是易于编写传统的webapps呢? 向气旋问好。 我更喜欢龙卷风旋风。 它有一个非常类似于龙卷风的API。 事实上,这是龙卷风的一个分叉。 但问题是它有相对小的社区。 亚历山大菲奥里是回购的唯一主要承诺者。
“ Pyramid是一个通用的,开源的Python Web应用程序开发框架,其主要目标是让Python开发人员更容易创buildWeb应用程序。” 我还没有真正使用金字塔,但我经历了文档。 据我所知,金字塔和Flask非常相似,我认为你可以在Flask看起来合适的地方使用金字塔,反之亦然。
编辑 :请求审查任何其他框架欢迎!
资料来源: http : //dhilipsiva.com/2013/05/19/python-libraries-django-twisted-tornado-flask-cyclone-and-pyramid.html
这显然是一个有些偏见的答案,但这不是一个错误的答案; 你应该总是使用Twisted。 我之前已经回答过类似的问题 ,但由于您的问题并不完全相同,所以下面是一些原因:
“最棒的表演”
Twistedmatrix.com网站不断监测我们的performance。 我们也是PyPy的类似网站首先要监控的项目之一,从而确保Twisted在运行时的良好性能,任何关心Python中高性能应用程序的人。
“可扩展性”
据我所知,列出的框架都没有内置的自动缩放支持; 他们都是通信框架,所以你必须做你的扩展节点之间的沟通工作。 但是,Twisted在内置的本地多处理支持方面具有优势。 公平地说,有一个Tornado的第三方附件 ,可以让你做同样的事情。 在最近的版本中, Twisted增加了一些function ,可以增加核心之间共享工作的方式,并且该领域的工作正在进行。 Twisted还有一些集成度很高的“本地” RPC协议,它提供了一个构build工具包,可以满足你想要的任何缩放成语。
“最有用”
很多人似乎觉得Twisted 非常有用 。 非常多,所以他们中的许多人已经扩展它,并使您的扩展可用。
“function”
开箱即用,Twisted包括:
- 良好的支持以下所有的testing驱动开发
- TCP服务器, 客户端 , 传输层安全
- SSH客户端和服务器
- IMAP4,ESMTP,POP3客户端和服务器
- DNS客户端和服务器
- HTTP客户端和服务器
- IRC,XMPP,OSCAR,MSN客户端和服务器
在最后这个部门,Twisted似乎是内置function的明显赢家。 而所有这一切,只需要超过2兆字节!
我喜欢@Glyph的回应。 Twisted是非常全面的,丰富的Python框架。 扭曲和龙卷风有一个非常相似的devise。 我非常喜欢这个devise:
- 它很快
- 容易明白
- 容易延伸
- 不需要c-extensions
- 适用于PyPy。
但是我想强调一下我喜欢的Tornado ,最近也受到欢迎。 龙卷风像Twisted一样使用callback风格编程,但是可以使用tornado.gen.engine
(Twisted中的twisted.internet.inlineCallbacks
)来内联。
代码库
最好的评论是从http://cyclone.io网站。; 旋风试图混合扭曲和龙卷风,因为:
Twisted是面向公众的非阻塞I / O最成熟的库之一。 Tornado是FriendFeed的networking服务器的开源版本,是Python最stream行,最快速的networking服务器之一,具有非常体面的用于构buildWeb应用程序的API。
这个想法是将Tornado的优雅和直接的API连接到Twisted的事件循环,从而实现了大量支持的协议。
但在2011年tornado.platform.twisted
出去,带来了类似的function。
性能
龙卷风有更好的performance 。 它也可以与PyPy无缝协作,并获得巨大收益。
可扩展性
像Twisted一样。 龙卷风有tornado.process
和很多rpc服务在它上面实现。
function
基于Tornado的包裹有71个 ,Twisted的148个和Gevent的48个。 但是,如果仔细观察并计算包裹上传时间的中位数,则会看到Twisted是最古老的,然后Gevent和Tornado是最新的。 此外,还有tornado.platform.twisted
模块,它允许您运行为龙卷风Twisted编写的代码 。
概要
随着龙卷风,你可以使用扭曲的代码。 没有必要使用旋转你的代码的旋风(你的代码变得更加混乱)。
至于2014年,Tornado被认为是被广泛接受和默认的asynchronous框架,可以在python2和python3上使用。 最新的4.x版本也提供了很多来自https://docs.python.org/dev/library/asyncio.html的function。;
我写了一篇文章,解释了为什么我认为Tornado是最好的Python Web框架 ,我写了更多关于Tornadofunction的东西。
( 更新 :我很遗憾地惊讶于这里推荐的几个答案,甚至提到Gevent,我认为这与这个优秀的图书馆的受欢迎程度,性能和易用性成正比!
Gevent和Twisted并不是相互排斥的,尽pipe一开始看起来相反。 有一个名为geventreactor
的项目,它可以相对平稳地利用两个世界的最好的,即:
- Gevent的高效便宜的(合作绿色)线程模型,在并发性方面更容易编程,坦率地说,Twisted的
inlineCallbacks
在许多协同程序中根本无法胜任性能方面的工作,在易用性/透明性方面:yield
和Deferreds
到处; 往往很难build立一些抽象; 可怕的无用的堆栈跟踪与裸露的Deferred
s以及,甚至更多的@inlineCallbacks
。 - Twisted的所有内置function都可以实现,包括但不限于
IReactorProcess.spawnProcess
。
我个人目前正在使用geventreactor桥接的扭曲12.3的geventreactor
。 我已经实现了我自己现在还未发布的geventreactor
新增和增强function,我将很快发布,希望作为geventreactor
的原始GitHub存储库的一部分: https : //github.com/jyio/geventreactor 。
我目前的布局允许我编程在Gevent的漂亮的编程模型,并利用诸如非阻塞socket
, urllib2
和其他模块的东西。 我可以使用普通的Python代码来做常规的事情,而不是像Twisted那样做简单的,基本的事情。 我也可以很容易地使用大多数Twisted通常不存在的第三方库,或者需要使用线程。
我也可以完全避免使用greenlet(而不是Deferred
s和callback,和/或@inlineCallbacks
)的笨拙和通常过于复杂的基于callback的编程。
(这个答案是基于我的个人经验,在现实生活中使用了Twisted和Gevent,使用Twisted的经验也很丰富(但我不认为是一个扭曲的专家)。 Twisted的function太多了,所以根据你所需要的Twisted的function,混合Gevent和Twisted的(相对无痛的)额外的复杂性可能不值得麻烦。