2

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

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

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

我真正不明白的是作者在理解 node.js中的观点——“除了你的代码之外,一切都是并行运行的”。我已经理解了类比和解释它的代码,但我仍然不明白“一切”和“代码”之间的区别是什么。我经常听到有关 node.js 的消息。

此外,人们称赞 node.js 的效率,因为一个并发连接的内存开销可能低至 8KB,但 CPU 负载呢?与 PHP + Apache 相比,node.js 是否做得更少?

4

4 回答 4

5

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

Node 并不是所有工作的工具。它非常适合受 IO 限制的应用程序。例如,如果您的应用程序需要大量的工作来处理模板,那么 Node 可能不适合您。相反,如果您只是在移动数据,Node 会非常有效。

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

该视频很好地解释了: http ://www.youtube.com/watch?v=F6k8lTrAE2g&feature=youtube_gdata

于 2012-07-15T17:29:11.647 回答
2

除了您的代码之外,一切都并行运行。

这意味着如果你这样做

while(true){}

您的代码中的任何地方,整个节点应用程序都会停止。当您编写的代码执行时,其他任何事情都不会执行。请求不会被处理,响应不会被返回,什么都没有。您必须非常小心,不要在节点中占用 CPU。

但是CPU负载呢?

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

于 2012-07-15T17:20:37.813 回答
2

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

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

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

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

于 2012-07-15T17:31:41.693 回答
1

“一切”指的是除了你的代码之外的一切。例如,处理 HTTP 的东西。另一种说法是“你的代码不会等待 node.js 做一些事情,比如通过 TCP 发送数据,因为这是异步完成的。”

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

于 2012-07-15T17:27:49.743 回答