【问题标题】:Twisted and Tornado difference when deploying?部署时 Twisted 和 Tornado 的区别?
【发布时间】:2014-08-19 17:26:05
【问题描述】:

我对Tornado只有一点了解,在部署的时候,最好用Nginx作为负载均衡器,配合Tornado进程的数量。

Twisted 怎么样?是不是也一样?

【问题讨论】:

    标签: twisted tornado


    【解决方案1】:

    如果我没有正确地跟踪您的问题,您似乎在问:“Tornado 是否应该使用 Nginx 作为前端,Twisted 怎么样?”

    如果这确实是问题所在,那么它会得到一个“取决于”的答案,但可能是以一种你可能没想到的方式。 在运行时的意义上,twisted、tornado 和 Nginx在很多方面都不是同一件事

    这三个系统都在其核心中使用相同的编程模式。 OO 人称之为 Reactor 模式,通常也称为异步 I/O 事件编程,而老式 Unix 人称之为 select 风格的事件循环。 (通过select/epoll/kqueue/WaitForMultipleObjects/等完成)

    为了回答这个问题,一些背景知识:

    • Twisted 是一个基于 Reactor 的框架,被创建用于以最通用的形式编写基于 python 的异步 I/O 项目。因此,虽然它对 Web 应用程序非常有用(通过 Twisted Web 子模块),但它同样适用于处理串行数据(通过 SerialPort 子模块)或实现完全不同的网络协议,如 ssh

    Twisted 在灵活性方面表现出色。如果您需要将许多 IO 类型粘合在一起,特别是如果您想将 IO 连接到 Web,那就太棒了。如 remudada 回答中所述,它还内置了应用程序工具 (twistd)。

    作为一个异步 I/O 框架,Twisted 的周转时间很少。虽然作为一个web 框架(虽然它正在积极地继续发展),但与 Flask 这样的插件丰富的框架相比,它明显落后于曲线,而且 Tornado 肯定比 Twisted Web 有许多 web 便利。

    • Torando 是 Python 中基于 Reactor 的框架,创建它是为了 以极快的速度提供 webpages/webapps(基本上和 python 一样快)提供网页)。编写它的人的目标是编写一个如此快速的系统,以至于生产代码本身可以是 python。

    Tornado 核心在逻辑上几乎与 Twisted 的核心匹配。这些项目的核心非常相似,因此在现代版本中,您可以运行 Twisted inside of Tornado 或运行 Tornado port inside of Twisted

    Tornado 一心一意地专注于快速提供网页/网络应用程序。在大多数应用程序中,它会比 Twisted Web 快 20%,但远没有支持其他异步 I/O 使用那么灵活。它(就像twisted)仍然是基于python的,所以如果给定的webapp做了太多基于CPU的工作,它的性能会很快下降。

    • Nginx 是一个基于 Reactor 的应用程序被创建用于服务网页和连接重定向用 C 编写。 Twisted 和 Tornado 使用 Reactor 模式让 python 运行得更快,而 Nginx 将事情带到下一步,并在 C 中使用该逻辑。

    当人们比较 Python 和 C 时,他们经常说 Python 慢了 1.2 到 100 倍。然而,在 Reactor 模式中(如果做得好,大部分时间都花在操作系统上)语言的低效率被最小化了——只要在反应器之外没有太多的逻辑发生。

    我没有确凿的数据来支持这一点,但我的期望是你会发现最简单的“Hello world”(IE 服务静态测试)在 Tornado 上的运行速度比在 Nginx 上的速度不超过 50%(使用 Twisted Web平均比 Tornado 慢 20%)。

    同一事物的速度不同,这会给我们带来什么影响?

    您问“最好使用 Nginx 作为负载均衡器与 Tornado 进程的数量”,所以要回答这个问题,我需要问你一个问题。

    您的部署方式是否对您采用多核技术至关重要?

    为了换取惊人的异步 IO 速度,Reactor 模式有一个弱点:

    • 每个 Reactor 只能利用一个进程核心。

    正如您可能猜到的那样,该弱点的另一面是 Reactor 模式非常有效地使用该核心,如果您有负载,应该能够将该核心接近 100% 使用。

    这又回到了您所询问的设计类型,但这个答案中所有背景的原因是因为这些服务的分层(Tornado 或 Twisted 前面的 Nginx)应该只采取多核机器的优势

    如果您在单核系统(最低级别的云服务器或像 Raspberry Pi 之类的嵌入式平台)上运行,则不应将反应器置于前端。这样做只会减慢整个系统的速度。

    如果您运行的反应堆服务比 CPU 内核更多(负载重),那么您也会对自己不利。

    所以:

    • 如果您在单核系统上部署:
      • 运行 Tornado 或 Twisted 的一个实例(如果是静态页面,则单独运行 Nginx)
    • 如果您尝试充分利用多个内核
      • 在应用程序端口上运行 Nginx(或 twisted),为每个剩余的处理器内核运行一个 Tornado 或 Twisted 实例。

    【讨论】:

    • 这与最初的问题无关,但为了澄清事实,Tornado 开发人员意识到了 Twisted 并故意着手为异步开发构建一组不同的抽象(例如 IOStream 与 Transport /协议)。核心事件循环最终被复制了,但这与围绕它的所有支持基础设施相比是很小的。
    • 我从未使用过 Twisted,因为我对 Tornado 很满意,这是一个朋友使用 Twisted 开发一个应用程序,并且由于 Python 特性而与他讨论使用负载均衡器,所以我猜它Twisted 和 Tornado 会是一样的逻辑吗?
    • Twisted 和 Tornado 与平衡器相比应该看起来相同(我怀疑你会在任何其他基于 Reactor 的系统中找到,例如 node.js)。谈论 Tornado 与 Twisted 时可能会引发圣战,但由于它们具有相同的核心,因此它们的用例往往相同——不包括可能有助于或阻碍任一框架的 devop 自定义。
    • 连Tornado都在试图摆脱Nginx,所以答案是Twisted和Tornado在Nginx作为负载均衡器的时候,背后的部署是一样的?
    • 是的。 Twisted 和 Tornado 之间只有外观上的差异(比如自动将服务分叉到后台的工具)。您在多个不同端口上运行服务并将这些端口配置到 Nginx 中的方式将完全相同(...再次,除非您添加的一些 3rd 方工具使事情变得不同)。
    【解决方案2】:

    Twisted 本身就是一个足够好的应用服务器,我宁愿直接使用它(不像 Tornado)

    如果你看官方指南http://twistedmatrix.com/documents/11.1.0/core/howto/application.html

    你可以看到它是如何设置的。当然你可以使用 twsited 的 uwsgi / nginx / Emperor,因为它可以作为标准应用程序运行,但我建议你在真正需要扩展和负载平衡时这样做。

    【讨论】:

    • 两者都有相同的概念(回调),所以我说它们与套接字的行为方式相同,所以在部署时也会相同?
    • 除非您使用的是最新版本的 uwsgi 2.0(支持异步套接字),否则应该没有区别。我在 2.0 上运气不佳。但与往常一样,尝试设置,您就会知道 :-)
    猜你喜欢
    • 2011-02-01
    • 2013-10-30
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2011-09-19
    • 1970-01-01
    • 2019-04-15
    相关资源
    最近更新 更多