Node.js 是如何工作的?

关于 Nodejs 我有几件事不明白。每个信息来源都说,由于缺乏线程锁定和上下文切换,node.js 比标准的线程 Web 服务器更具可伸缩性,但我想知道,如果 node.js 不使用线程,它如何并行处理并发请求?事件 I/O 模型是什么意思?

非常感谢你的帮助。 谢谢

40808 次浏览

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

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

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

更新 在最底层(C + + 代码,而不是 Javascript) ,node.js 中的 实际上有多个线程: 有一个 IO 工作者池,其任务是接收 IO 中断并将相应的事件放入队列,由主线程处理。这可以防止主线程被中断。

虽然问题已经解释了很长时间,我把我的想法在同一个。

Node.js是单线程的 JavaScript执行期函式库。基本上,它的创建者 Ryan Dahl关心的是使用多个 threads的并行处理不是正确的方式或太复杂。

如果 Node.js不使用 threads,它如何并行处理并发请求

回答: 当你说它不使用线程,Node.js使用线程,但是以一种聪明的方式,这是完全错误的句子。它使用单线程服务于线程池中的所有 HTTP requests和多线程(在 libuv中)来处理任何阻塞操作

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

事件 I/O 模型是什么意思?

答: 正确的术语是 异步多工文件描述符。它几乎从来没有像 Node.js官方网站所说的那样被屏蔽。当任何请求到达节点服务器时,它从不对请求进行排队。它接受请求并开始执行,如果它阻塞操作,然后它被发送到工作线程区域,并且在 code执行完成后立即注册相同的回调,它触发相同的回调,然后进入事件队列,在创建响应之后再次通过事件循环进行处理并发送到相应的客户端。

有用链接: 点击这里

Node JS 是一个 JavaScript 执行期函式库。浏览器和 NodeJS 都运行在 V8JavaScript 引擎上。Node JS 使用事件驱动的、非阻塞的 I/O 模型,这使它变得轻量级和高效。节点 JS 应用程序使用单线程事件循环体系结构来处理并发客户端。实际上,它的主事件循环是单线程的,但是大多数 I/O 工作在不同的线程上,因为 Node JS 中的 I/O API 设计为异步/非阻塞的,以适应主事件循环。考虑这样一个场景: 我们为 user1和 user2的详细信息请求一个后端数据库,然后在屏幕/控制台上打印它们。对这个请求的响应需要时间,但是这两个用户数据请求可以独立地同时执行。当100个人同时连接时,Node 不会使用不同的线程,而是会在这些连接上循环,并触发代码应该知道的任何事件。如果连接是新的,它会告诉你。如果连接已经向您发送了数据,它将告诉您。如果连接没有做任何事情,它将跳过它,而不是占用它的精确 CPU 时间。Node 中的一切都基于对这些事件的响应。所以我们可以看到结果,CPU 只关注一个进程,没有一堆线程需要关注。在 Node.JS 应用程序中没有缓冲,它只是以块的形式输出数据。

虽然这个问题已经得到了回答,但我还是想简单地分享一下我的理解

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

Nodejs 中的并行处理是借助于两个概念实现的

  1. 异步的
  2. 非阻塞 IO