【问题标题】:Differences between node.js and Tornado [closed]node.js 和 Tornado 之间的区别 [关闭]
【发布时间】:2011-04-06 05:06:40
【问题描述】:

除了 node.js 是用 JS 编写的,Tornado 是用 Python 编写的,两者之间有什么区别?它们都是非阻塞异步 Web 服务器,对吧?除了语言之外,为什么还要选择一个?

【问题讨论】:

    标签: javascript python comparison node.js tornado


    【解决方案1】:

    node.js 的主要优点是它的所有库都是异步的,因此您不必担心阻塞。有mysql、postgres、redis等的异步库,默认都是异步的。

    Python 有一个可以处理任何东西的库——但这些库中的大多数都不是异步的。为了利用龙卷风(而不是阻止进程),需要特殊库(例如,您不能只使用“pip install redis”并使用它,您需要类似brukva),并且有龙卷风库比 node.js 库少得多。例如,目前没有可用的异步 mysql tornado 驱动程序(或者至少我不知道)。

    但是您仍然可以在 tornado 中使用许多 python 库(不执行 i/o 的库),并且 tornado 社区正在提高和填补这些空白。

    根据我的经验,使用 node.js 编写应用程序比使用 tornado 更容易。我个人从 node.js 切换到 tornado,因为它更适合我的 python 项目的现有基础架构(提供 html 页面的 django 站点和提供实时功能的 tornado 服务器之间的集成非常轻松)。

    【讨论】:

    • 应该注意的是,tornado 现在可以访问所有来自 twisted 的异步库(参见 tornadoweb.org/documentation/twisted.html)。然而,最初的问题明确建议不要考虑语言,重要的是 Python 有生成器,它们使编写异步代码更容易:在 javascript 中没有这样的东西。有几十个库试图解决 V8(Step 等)中缺少的 yield,但没有语言支持,它们的语法不太漂亮,处理的边缘情况也比 python 的“yield”少。
    • 米哈伊尔,你说的 JavaScript 不支持生成器是不正确的。请参阅 JavaScript 1.7 中有关生成器实现的信息(并注意当前版本 1.8.2 来自 2009 年中期):New in JavaScript 1.7: Generators
    • node.js 使用的语言不是 Javascript 1.7 或 1.8,它更接近 ECMAScript5。这是因为 node.js 使用了 V8 引擎,它没有实现 JavaScript 1.7 的所有特性(参见 code.google.com/p/v8/issues/detail?id=890 )。这可能会在未来发生变化,并且可能有正当的理由(例如 JS 1.7 不是标准),但 JavaScript 1.7 是在 2006 年引入的,而 2012 年的 v8 中没有“yield”。
    • 你是对的,我以某种方式将你的评论解释为好像你在说 JavaScript 没有生成器。我的错。
    • 这个答案是否在 2 年后更新?
    【解决方案2】:

    正如 Rich Bradshaw 指出的,Node.js 是用 JS 编写的,这意味着您可以保持前端和后端使用相同的语言,并且可能共享一些代码库。对我来说,这是 Node.js 的巨大潜在优势。 Node 似乎还提供了更多开箱即用的异步库。

    V8 应该使 JS 比 Python at least that's what benchmarks seem to suggest 更快,但这可能并不重要,因为 Node.jsTornado (以及大多数其他网络框架)问题)使用本地库的包装器。许多 Python 标准库是用 C 编写的,或者可以用更快的替代方案代替,从而进一步减少潜在差异。

    Web 服务通常受 I/O 限制,这意味着我们将时间花在等待数据存储上而不是处理数据上。这使得 JS 和 Python 之间的合成速度差异在许多应用程序中无关紧要。

    【讨论】:

    • 非常正确的观点
    【解决方案3】:

    node.js 使用 V8 编译成汇编代码,tornado 还没有这样做。

    除此之外(这实际上似乎对速度没有太大影响),这是生态系统。你更喜欢 JS 的事件模型,还是 Python 的工作方式?你更喜欢使用 Python 或 JS 库吗?

    【讨论】:

    • 我只是针对简单的单进程 helloworld 应用运行 httperf。 PyPy 1.8 上的 Tornado(~8k req/s)与 Node 的性能(~11k req/s)相差不远。
    • V8 编译成机器码,而不是汇编。重要的是编译是即时的而不是静态的:en.wikipedia.org/wiki/V8_(JavaScript_engine)
    【解决方案4】:

    Nodejs 还具有称为 Socket.io 的 websocket 的无缝集成/实现。它处理支持套接字的浏览器 - 事件,并且还具有对旧浏览器的向后轮询兼容性。它在需要通知框架或一些类似的基于事件的编程的开发中非常快。

    【讨论】:

    • 好吧,socketTornad 是 socket.io 的一个分叉实现,它完全取决于下一次更新何时提供支持。这里提到这一点的重点是 nodejs 中 socket.io 的美妙之处,它减少了很多场景的处理。
    • 不知道你在说什么。那个项目已经过时了。 Tornadio 会随着 socket.io 参考的发布保持更新:github.com/MrJoes/tornadio2
    【解决方案5】:

    如果对 python 没有个人偏好,我建议你使用 NodeJS。我非常喜欢 Python,但是对于异步,我选择 Tornado 而不是节点,后来不得不努力寻找做某事的方法,或者支持异步的库(比如 Cassandra 在测试中具有异步,但我无法找到使用 cqlengine 的方法async. 不得不选择 Mongo,因为我已经超过了最后期限)。 在性能和异步方面,Node 远胜于 tornado。

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 2014-03-24
      • 2013-01-04
      • 1970-01-01
      • 1970-01-01
      • 2011-06-24
      • 2014-11-28
      • 2016-08-01
      • 2011-10-07
      相关资源
      最近更新 更多