并行处理-node.js如何工作?

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

非常感谢您的帮助。谢谢

Davita asked 2020-02-20T23:46:35Z
3个解决方案
80 votes

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

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

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

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

Michael Borgwardt answered 2020-02-21T00:00:17Z
2 votes

尽管问题已经很长时间解释过了,但我的想法还是一样。

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

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

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

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

事件I / O模型意味着什么?

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

有用的链接:点击这里

Alok Deshwal answered 2020-02-21T00:01:09Z
2 votes

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应用程序中没有缓冲,它只是简单地以块的形式输出数据。

Mazumder Nazmul answered 2020-02-21T00:01:33Z
translate from https://stackoverflow.com:/questions/9497076/how-node-js-works