问题:何时使用龙卷风,何时使用Twisted / Cyclone / GEvent /其他[关闭]
以下哪个框架/库是构建现代多用户Web应用程序的最佳选择?我很想拥有一个异步Web服务器,这将使我可以轻松扩展。哪种解决方案将提供最佳的性能 / 可伸缩性 / 最有用的框架(就易于使用和易于开发而言)?
如果它将提供良好的功能(websockets,rpc,流式传输等),那就太好了。
每个解决方案的优缺点是什么?
回答 0
“ 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
这显然是一个有偏见的答案,但这与错误的答案不同。您应该始终使用Twisted。我之前也回答过类似的问题,但是由于您的问题并不完全相同,因此有一些原因:
“最棒的表演”
Twisted在speed.twistedmatrix.com网站上持续监控我们的表现。我们也是PyPy的类似网站监控的首批项目之一,从而确保Twisted在运行时的良好性能,这是任何关注Python中高性能应用程序的人的。
“可伸缩性”
据我所知,列出的框架都没有内置的自动缩放支持。它们都是通信框架,因此您必须进行工作以在扩展节点之间进行通信。但是,Twisted在其对本地多处理的内置支持方面具有优势。公平地说,Tornado有一个第三方加载项,使您可以执行相同的操作。在最新发行版中,Twisted添加了功能,这些功能增加了内核之间共享工作的方式数量,并且该领域的工作正在进行中。扭曲的也有一对夫妇的良好整合,“本土” RPC它提供了一个建筑套件,无论缩放成语你想追求的协议。
“最有用”
很多人似乎发现Twisted 非常有用。 如此之多,以至于其中许多人都对其进行了扩展,并向您提供了其扩展名。
“功能”
开箱即用,Twisted包括:
- 对以下所有测试驱动开发的良好支持
- TCP服务器,客户端,传输层安全
- SSH客户端和服务器
- IMAP4,ESMTP,POP3客户端和服务器
- DNS客户端和服务器
- HTTP客户端和服务器
- IRC,XMPP,OSCAR,MSN客户端和服务器
至少在最后一个部门中,Twisted似乎是内置功能的明显赢家。而这一切,仅需2兆字节即可!
回答 2
我喜欢@Glyph回复。Twisted非常全面,丰富的python框架。Twisted和Tornado具有非常相似的设计。我非常喜欢这种设计:
- 它很快
- 容易理解
- 易于扩展
- 不需要 c扩展名
- 在PyPy上工作。
但是,我想强调Tornado,我更喜欢它,最近又变得流行。与Twisted类似,Tornado使用回调样式编程,但是可以使用tornado.gen.engine
(twisted.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功能的信息。
回答 3
(更新:我对这里推荐甚至提到Gevent的答案很少感到惊讶,我认为这与这个出色的库的受欢迎程度,性能和易用性不成比例!)
Gevent和Twisted并不是互斥的,尽管乍一看似乎相反。有一个名为的项目geventreactor
,可以使人们相对平稳地利用两全其美的优势,即:
- Gevent的高效,廉价(绿色协作)线程模型,在并发方面更容易编程—坦率地说,
inlineCallbacks
对于许多协同程序,Twisted的性能根本无法胜任,在易用性/透明度方面:yield
和Deferreds
无处不在; 通常很难建立一些抽象;带有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(而不是Deferred
s和callbacks和/或@inlineCallbacks
)完全避免笨拙且通常过于复杂的基于回调的编程。
(此答案是根据我在现实生活项目中同时使用Twisted和Gevent的个人经验编写的,并且使用Twisted的经验也很多(但我并没有声称自己是Twisted专家)。我必须编写hasn的软件不必使用Twisted的太多功能,因此根据Twisted所需的功能集,混合Gevent和Twisted的(相对轻松)额外的复杂性可能不值得。