node.js和Tornado之间的区别[关闭]


78

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

Answers:


96

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

Python拥有任何东西的库-但是这些库大多数不是异步的。为了利用龙卷风(而不是阻止进程)的优势,有必要使用特殊的库(例如,您不能仅'pip install redis'并使用它,您将需要brukva之类的东西),而且要少得多龙卷风库比node.js库。例如,目前没有异步mysql龙卷风驱动程序可用(或者至少我不知道)。

但是,您仍然可以将许多python库与龙卷风一起使用(那些不执行I / O的库),并且龙卷风社区正在提高并填补空白。

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


24
应该注意的是,tornado现在可以访问twisted所有异步库的访问权限(请参阅tornadoweb.org/documentation/twisted.html)。但是,最初的问题明确提出不要考虑语言,Python具有生成器很重要,它们使编写异步代码变得容易得多:javascript中没有这样的东西。有数十种库试图解决V8中缺少产量的问题(Step等),但是如果没有语言支持,它们的语法并不那么精巧,处理的边缘情况少于python的“ yield”。
米哈伊尔·科罗波夫

1
Mikhail,您对缺少对JavaScript生成器的支持是错误的。请参阅有关JavaScript 1.7中的generators实现的信息(请注意,当前版本1.8.2是2009年中的版本):JavaScript 1.7中的新功能:Generators
塔德克2012年

8
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
。– Mikhail Korobov

3
没错,我以某种方式将您的评论解释为好像您在说JavaScript没有生成器。我的错。
塔德克2012年

4
这个答案在2年后会更新吗?
nkint 2014年

13

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

V8应该使JS比Python更快,至少这是基准似乎表明的,但这并不重要,因为Node.jsTornado(以及与此相关的大多数其他Web框架)都使用本机库的包装器。许多Python标准库都是用C编写的,或者可以用更快的替代方法代替,这可以进一步缓解潜在的差异。

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


1
非常正确的观点
securecurve 2013年

10

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

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


6
我只是针对简单的单进程helloworld应用程序运行httperf。PyPy 1.8上的龙卷风(〜8k req / s)与Node的性能(〜11k req / s)相差不远。
jholster 2012年

2
V8编译为机器代码,而不是汇编代码。而且重要的是,编译必须是及时的,而不是静态的:en.wikipedia.org/wiki/V8_(JavaScript_engine)
Max Heiber 2015年

3

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


好吧,有一个socketTornad是socket.io的一个分叉实现,它完全取决于下一次更新的支持时间。这里要提到的全部要点是nodejs中socket.io的优点,它减少了很多情况的处理。
Sushant Khurana

6
不知道你在说什么。该项目是古老而过时的。Tornadio会随着socket.io参考的发布保持更新:github.com/MrJoes/tornadio2
jdi 2012年

3

如果没有python的个人偏好,我建议您使用NodeJS。我非常喜欢Python,但对于异步,我在节点上选择了Tornado,后来不得不努力寻找一种做事的方法,或者需要异步支持的库(例如Cassandra在测试中具有异步功能,但是我找不到在任何地方使用cqlengine的方法)异步。因为我已经超过了截止日期,所以不得不选择Mongo。在性能和异步方面,Node比龙卷风要好得多。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.