182

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

如果它能提供良好的功能(websockets、rpc、流媒体等),那就太好了。

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

4

4 回答 4

231

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,反之亦然。

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

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

于 2013-05-19T02:33:19.530 回答
61

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

“最棒的表演”

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

“可扩展性”

据我所知,列出的框架都没有对自动扩展的内置支持。它们都是通信框架,因此您必须在扩展节点之间进行通信。然而,Twisted 的优势在于其对本地多处理的内置支持。公平地说,Tornado 有一个第三方插件可以让你做同样的事情。在最近的版本中,Twisted 添加了一些功能,增加了您可以在内核之间共享工作的方式的数量,并且该领域的工作正在进行中。Twisted 还有一些集成良好的原生” RPC 协议,它们为您想要追求的任何扩展习惯提供了一个构建工具包。

“最有用”

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

“功能性”

开箱即用,Twisted 包括:

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

于 2012-12-19T17:55:37.340 回答
48

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

  • 它很快
  • 容易明白
  • 易于扩展
  • 不需要c 扩展
  • 在 PyPy 上工作。

但我想强调Tornado,我更喜欢它并且最近获得了人气。Tornado 和 Twisted 一样,使用回调样式编程,但可以使用tornado.gen.engine( twisted.internet.inlineCallbacksin 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 功能的内容。

于 2013-01-29T20:37:34.987 回答
16

更新:我很遗憾这里推荐甚至提到 Gevent 的答案很少——我认为这与这个优秀库的受欢迎程度、性能和易用性不成比例!)

Gevent 和 Twisted 并不是相互排斥的,尽管相反的情况起初看起来很明显。有一个名为的项目geventreactor可以让人们相对顺利地利用两全其美,即:

  • Gevent 的高效且廉价(合作绿色)线程模型,在并发方面更容易编程——坦率地说,TwistedinlineCallbacks在性能方面根本无法胜任许多协程的工作,而且在易用性/透明性条款:yield无处不Deferreds在;通常很难构建一些抽象;裸Deferreds 以及 . 甚至更是如此@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 无关或需要使用线程的第 3 方库。

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

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

于 2013-03-04T19:46:15.870 回答