“除了你的代码,一切都在并行运行”......等等什么?

时间:2012-07-15 17:18:29

标签: node.js

我正在尝试学习Node.js以及我理解的一些要点:

  1. Node.js不会为每个请求创建一个单独的进程,而只是一个处理所有请求的进程。

  2. 它是异步的,这意味着您可以将回调附加到持久的过程中,并继续完成其余的工作,而无需等待它完成。

  3. 我真正不理解的是作者在Understanding node.js中的观点 - “除了你的代码之外,所有东西并行运行”。我已经理解了解释它的类比和代码,但我仍然不明白“Everything”和“code”之间的区别。关于node.js,我经常听到这个。

    此外,由于一个并发连接的内存开销可能低至8KB但人们的CPU负载如何,因此人们可以节点node.js的效率。与PHP + Apache相比,node.js是否会减少它?

4 个答案:

答案 0 :(得分:5)

Node.js在您的应用程序中运行JavaScript时使用单个线程。异步的任务(网络,文件系统等)都会自动在不同的线程上处理。这意味着您可以获得多线程应用程序的大部分功能,而无需担心锁定资源所带来的所有麻烦。

节点不是每个工作的工具。它非常适合IO绑定的应用程序。例如,如果您的应用程序需要大量工作来处理模板,那么Node可能不适合您。相反,如果只是改变数据,Node可以非常有效。

Node经常被引用为比Apache这样的服务器更快的原因是它不会创建一个线程以及用它来处理请求的所有资源。在Apache中,大多数情况下,线程处理请求正在等待网络或文件系统数据。虽然这样做,却浪费了资源。使用Node,只有一个线程处理这些请求(在您的应用程序中)。同样,这对某些事情来说很有用,但是如果你有很多处理要做,那么Node就不会有效,因为它在这些情况下一次只能处理一个请求。

此视频非常适合解释:http://www.youtube.com/watch?v=F6k8lTrAE2g&feature=youtube_gdata

答案 1 :(得分:2)

  

除了您的代码之外,所有内容都会并行运行。

这意味着如果你做了

while(true){}

您的代码中的任何位置,整个节点应用程序都将停止。当你编写的代码执行时,没有别的。请求将不会被处理,响应将不会被返回,没有。你必须非常小心,不要在节点中占用cpu。

  

但是CPU负载呢?

这完全取决于应用程序的性质和负载。如果您的应用程序正忙,它将使用更多的CPU。

答案 2 :(得分:2)

想象一下中间有一个交通警察的繁忙路口。当警察正常工作时,数百辆汽车可以非常快速有效地通过十字路口。

如果警察在进行交通时开始在他的手机上接收和接听短信,那么事情可能会很快失控。

交通警察是你的node.js应用程序,他花在短信上的时间就是作者所说的“你的代码”。

换句话说:node.js的性能会随着你作为交通警察的使用而越多。你开始使用它来做除了拉动和推送数据之外的事情就越多(即:排序数字列表,渲染html模板等),你接受和快速处理新连接的能力就越大。

答案 3 :(得分:1)

“Everything”指代代码之外的所有其他内容。例如,处理HTTP的东西。说同样的事情的另一种方式是“你的代码不等待node.js做东西,比如通过TCP发送数据,因为那是异步完成的。”

要回答你的第二个问题,我不知道哪个CPU负载较少,我猜它们是相似的。 Node.js的优势在于,由于前面提到的异步性,CPU得到了更好的利用。