这些框架/库中的哪一个是构建现代多用户 Web 应用程序的最佳选择?我很想拥有一个异步网络服务器,它可以让我轻松扩展。什么解决方案将提供最佳性能/可扩展性/最有用的框架(在易于使用和易于开发方面)?
如果它能提供良好的功能(websockets、rpc、流媒体等),那就太好了。
每种解决方案的优缺点是什么?
“ Django是一个高级 Python Web 框架,它鼓励快速开发和简洁、实用的设计”。如果您正在构建类似于电子商务网站的东西,那么您可能应该使用 Django。它会让你的工作快速完成。您不必担心太多的技术选择。它提供了从模板引擎到 ORM 所需的一切。对于您构建应用程序的方式,它会有点固执己见,如果您问我,这很好。它拥有所有其他库中最强大的社区,这意味着可以轻松获得帮助。
“ Flask是基于 Werkzeug、Jinja 2 和善意的 Python 微框架”。当心 - “微框架”可能会产生误导。这并不意味着 Flask 是一个半生不熟的库。这意味着烧瓶的核心非常非常简单。与 Django 不同,它不会为您做出任何技术决策。您可以自由选择任何您喜欢的模板引擎或 ORM。尽管它默认带有 Jinja 模板引擎,但您始终可以自由选择我们自己的模板引擎。据我所知,Flask 可用于编写 API 端点(RESTful 服务)。
“ Twisted是一个用 python 编写的事件驱动的网络引擎”。这是一个高性能的引擎。其速度的主要原因是所谓的延迟。Twisted 建立在 deferred 之上。对于那些不了解延迟的人来说,它是通过异步架构实现的机制。Twisted 非常快。但不适合编写常规的 webapps。如果你想做一些底层网络的东西,twisted 是你的朋友。
" Tornado是一个 Python web 框架和异步网络库,最初在 FriendFeed 开发。通过使用非阻塞网络 I/O,Tornado 可以扩展到数万个打开的连接,使其成为长轮询、WebSockets 和其他应用程序的理想选择需要与每个用户建立长期连接”。Tornado 位于 Django 和 Flask 之间。如果你想用 Django 或 Flask 写东西,但如果你需要更好的性能,你可以选择 Tornado。如果架构正确,它可以很好地处理 C10k 问题。
“ Cyclone是 Python 的 Web 服务器框架,将 Tornado API 实现为 Twisted 协议”。现在,如果您想要一些几乎与 Twisted 一样高性能但易于编写传统 web 应用程序的东西怎么办?向旋风问好。我更喜欢旋风而不是龙卷风。它有一个与 Tornado 非常相似的 API。事实上,这是 Tornado 的一个分支。但问题是它的社区相对较小。Alexandre Fiori 是回购协议的唯一主要提交者。
“ Pyramid是一个通用的、开源的 Python Web 应用程序开发框架。它的主要目标是让 Python 开发人员更容易创建 Web 应用程序。” 我还没有真正使用过 Pyramid,但我浏览了文档。据我了解,Pyramid 与Flask非常相似,我认为您可以在Flask看起来合适的任何地方使用 Pyramid,反之亦然。
编辑:欢迎请求审查任何其他框架!
这显然是一个有点偏颇的答案,但这与错误答案不同;你应该总是使用 Twisted。我之前回答过类似的问题,但是由于你的问题不太一样,这里有一些原因:
Twisted 在speed.twistedmatrix.com网站上持续监控我们的表现。我们也是PyPy 的类似站点监控的首批项目之一,从而确保了 Twisted 在运行时的良好性能,任何人都关心 Python 中的高性能应用程序。
据我所知,列出的框架都没有对自动扩展的内置支持。它们都是通信框架,因此您必须在扩展节点之间进行通信。然而,Twisted 的优势在于其对本地多处理的内置支持。公平地说,Tornado 有一个第三方插件可以让你做同样的事情。在最近的版本中,Twisted 添加了一些功能,增加了您可以在内核之间共享工作的方式的数量,并且该领域的工作正在进行中。Twisted 还有一些集成良好的“原生” RPC 协议,它们为您想要追求的任何扩展习惯提供了一个构建工具包。
很多人似乎发现 Twisted非常有用。 如此之多,以至于他们中的许多人都对其进行了扩展,并为您提供了他们的扩展。
开箱即用,Twisted 包括:
至少在最后一个部门中,Twisted 似乎是内置功能的明显赢家。而这一切,都在一个超过 2 兆字节的包中!
我喜欢@Glyph 的回复。Twisted 是一个非常全面、丰富的python 框架。Twisted 和 Tornado 的设计非常相似。我非常喜欢这个设计:
但我想强调Tornado,我更喜欢它并且最近获得了人气。Tornado 和 Twisted 一样,使用回调样式编程,但可以使用tornado.gen.engine
( twisted.internet.inlineCallbacks
in Twisted) 内联。
最好的评论来自http://cyclone.io网站。旋风试图混合 Twisted 和 Tornado,因为:
Twisted 是可供公众使用的最成熟的非阻塞 I/O 库之一。Tornado 是 FriendFeed 的 web 服务器的开源版本,它是 Python 最流行和最快速的 web 服务器之一,具有非常不错的 API 用于构建 web 应用程序。
这个想法是将 Tornado 优雅而直接的 API 与 Twisted 的 Event-Loop 连接起来,从而实现大量支持的协议。
但在 2011tornado.platform.twisted
年推出,它带来了类似的功能。
Tornado 的性能要好得多。它还可以与 PyPy 无缝协作,并获得巨大收益。
和 Twisted 一样。Tornado 在tornado.process
其上实现了许多 rpc 服务。
有 71 个基于 Tornado 的软件包,相比之下,有 148 个 Twisted 和 48 个 Gevent。但是如果你仔细观察并计算包上传时间的中位数,你会发现 Twisted 是最旧的,然后是 Gevent 和 Tornado 是最新鲜的。此外,还有一个tornado.platform.twisted
模块允许您在 Tornado 上运行为 Twisted 编写的代码。
使用 Tornado,您可以使用 Twisted 的代码。无需使用只会扭曲您的代码的旋风(您的代码变得更加混乱)。
至于 2014 年,Tornado 被认为是被广泛接受的默认异步框架,适用于 python2 和 python3。最新版本 4.x 还带来了来自https://docs.python.org/dev/library/asyncio.html的许多功能。
我写了一篇文章,解释了为什么我认为Tornado - 最好的 Python Web 框架,我在其中写了更多关于 Tornado 功能的内容。
(更新:我很遗憾这里推荐甚至提到 Gevent 的答案很少——我认为这与这个优秀库的受欢迎程度、性能和易用性不成比例!)
Gevent 和 Twisted 并不是相互排斥的,尽管相反的情况起初看起来很明显。有一个名为的项目geventreactor
可以让人们相对顺利地利用两全其美,即:
inlineCallbacks
在性能方面根本无法胜任许多协程的工作,而且在易用性/透明性条款:yield
无处不Deferreds
在;通常很难构建一些抽象;裸Deferred
s 以及 . 甚至更是如此@inlineCallbacks
.IReactorProcess.spawnProcess
.我个人目前使用 Gevent 1.0rc2 和 Twisted 12.3 桥接geventreactor
。我已经实现了我自己的尚未发布的添加和增强geventreactor
,我将很快发布,希望作为geventreactor
原始 GitHub 存储库的一部分:https ://github.com/jyio/geventreactor 。
我当前的布局允许我在 Gevent 的良好编程模型中进行编程,并利用诸如非阻塞和其他模块之类的socket
东西urllib2
。我可以使用常规的 Python 代码来做常规的事情,而不是像 Twisted 那样做一些简单、基本的事情所带来的学习曲线和不便。我还可以轻松地使用大多数通常与 Twisted 无关或需要使用线程的第 3 方库。
我还可以通过使用 greenlets(而不是Deferred
s 和回调,和/或@inlineCallbacks
)来完全避免尴尬且通常过于复杂的基于回调的编程。
(这个答案是根据我在现实生活项目中同时使用 Twisted 和 Gevent 的个人经验编写的,使用 Twisted 的经验要多得多(但我不声称自己是 Twisted 专家)。我必须编写的软件没有不必使用太多 Twisted 的功能,因此根据您需要的 Twisted 功能集,混合 Gevent 和 Twisted 的(相对轻松的)额外复杂性可能不值得麻烦。)