node.js如何工作?

Dav*_*ita 49 parallel-processing node.js

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

非常感谢您的帮助.谢谢

Mic*_*rdt 80

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

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

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

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

  • @Davita这里有一个关于node.js事件循环的小文章:http://blog.mixu.net/2011/02/01/understanding-the-node-js-event-loop/ (5认同)
  • @Davita:CPU不执行I/O操作.服务器端代码不必涉及,直到外部硬件填充了一些缓冲区并通过中断机制告诉CPU这一点. (3认同)
  • 谢谢迈克尔。我理解异步IO操作是JS的本质,但我不明白的是,如果node.js/JS是单线程的,它是如何处理异步操作的。它可以与服务器端代码并​​行运行异步 I/O 操作,但如何。 (2认同)

Alo*_*wal 7

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

Node JS 是单线程 javascript 运行时环境。基本上,Node JS 创建者 (Ryan Dahl) 担心的是,使用多线程进行并行处理不是正确的方式或过于复杂。

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

Ans:你说它不使用线程是完全错误的句子,Node Js 使用线程但是以一种聪明的方式。它使用单线程来处理所有的 HTTP 请求和线程池中的多个线程(在 libuv 中)来处理任何阻塞操作

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

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

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

有用的链接: 点击这里


Maz*_*mul 5

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 应用程序中没有缓冲,它只是以块的形式输出数据。Node 中的一切都基于对这些事件的响应。所以我们可以看到结果,CPU 一直专注于那个进程,没有一堆线程来关注。Node.JS 应用程序中没有缓冲,它只是以块的形式输出数据。Node 中的一切都基于对这些事件的响应。所以我们可以看到结果,CPU 一直专注于那个进程,没有一堆线程来关注。Node.JS 应用程序中没有缓冲,它只是以块的形式输出数据。