node.js如何工作?

时间:2012-02-29 10:06:25

标签: node.js parallel-processing

我不了解nodejs的几个方面。由于缺少线程锁定和上下文切换,每个信息源都说node.js比标准的线程Web服务器更具可扩展性,但我想知道,如果node.js不使用线程,它如何并行处理并发请求?事件I / O模型意味着什么?

非常感谢您的帮助。 感谢

4 个答案:

答案 0 :(得分:78)

Node完全由事件驱动。基本上,服务器由一个接一个处理一个事件的线程组成。

进入的新请求是一种事件。服务器开始处理它,当有阻塞IO操作时,它不会等到它完成,而是注册一个回调函数。然后服务器立即开始处理另一个事件(可能是另一个请求)。当IO操作完成时,这是另一种事件,服务器将通过一旦有时间执行回调来处理它(即继续处理请求)。

因此服务器永远不需要创建额外的线程或在线程之间切换,这意味着它的开销很小。如果要充分利用多个硬件核心,只需启动node.js的多个实例

<强>更新 在最低级别(C ++代码,而不是Javascript),node.js中的there actually are multiple threads:有一个IO工作池,它的工作是接收IO中断并将相应的事件放入队列以进行处理主线程。这可以防止主线程被中断。

答案 1 :(得分:2)

Node JS是JavaScript运行时环境。浏览器和Node JS都在V8 JavaScript引擎上运行。 Node JS使用事件驱动的非阻塞I / O模型,从而使其轻巧高效。 Node JS应用程序使用单线程事件循环体系结构来处理并发客户端。实际上,它的主事件循环是单线程的,但是大多数I / O在单独的线程上工作,因为Node JS中的I / O API在设计上是异步/非阻塞的,以便适应主事件循环。考虑以下情况:我们请求后端数据库获取user1和user2的详细信息,然后将它们打印在屏幕/控制台上。对这个请求的响应需要时间,但是两个用户数据请求都可以独立且同时执行。当100个人同时连接而不是使用不同的线程时,Node将遍历这些连接并触发代码应知道的任何事件。如果连接是新的,它将告诉您。如果连接发送了数据,则将告诉您。如果连接没有执行任何操作,它将跳过该连接,而不是占用精确的CPU时间。 Node中的所有内容都基于对这些事件的响应。因此,我们可以看到结果,CPU专注于该进程,并且没有一堆线程需要注意。Node.JS应用程序中没有缓冲,它只是简单地以块的形式输出数据。

答案 2 :(得分:1)

虽然问题已经在很长一段时间内得到解释,但我的想法也是如此。

Node JS是单线程技术。基本上Node JS创建者(Ryan Dahl)关注的是使用多线程的并行处理不是正确的方法或太复杂。

如果node.js没有使用线程,它如何并行处理并发请求

答案当你说它没有使用线程时,它是完全错误的句子,Node Js以聪明的方式使用线程。 它使用单线程来处理所有HTTP请求&amp;线程池中的多个线程(在libuv中)用于处理任何阻塞操作

Libuv:用于处理异步I / O的库。

事件I / O模型的含义是什么?

Ans:正确的术语是非阻塞I / O 。它几乎从不像Node JS官方网站那样阻止。当任何请求进入节点服务器时,它永远不会将请求排队。它接受请求并开始执行,如果它的阻塞操作然后它被发送到工作线程区域并在代码执行完成后立即注册回调,它触发相同的回调并转到事件队列并在创建响应之后再次通过事件循环处理并发送到相应的客户端。

有用的链接: click here

答案 3 :(得分:0)

虽然已经回答了,但还是想简单说说自己的理解

<块引用>

Nodejs 使用一个名为 Libuv 的库,所以这个 Libuv 是用 C 编写的 使用线程概念的语言。这些线程被称为 因为工作人员和这些工作人员负责处理来自客户端的多个请求。

nodejs 中的并行处理是通过 2 个概念实现的

<块引用>
  1. 异步
  2. 非阻塞 IO