是否所有节点j都请求初始发送到回调队列?Node js如何管理并发用户?

时间:2017-12-10 11:44:01

标签: javascript node.js asynchronous

如果他们在当前场景中没有IO,会发生什么? 请求是否会以同步方式执行,每个请求都必须等待先前的请求??

是否所有节点j都请求初始发送到回调队列?否则堆栈抛出堆栈溢出以防所有请求都由堆栈提供..

我刚刚说过使用节点并且完全不确定事情是如何工作的?每个在线网站都说事件循环是一个服务员在一个限制器接受命令但我不知道节点如何处理请求,以防有数百个请求突发加载......这些请求是否会在某种队列中保持不变

1 个答案:

答案 0 :(得分:0)

事件多路分解器是Node JS中的通知发出接口。它用于以事件的形式收集来自监视源的每个请求,并将每个事件排入队列。是构成事件队列的多路分解器。事件多路分解器是由Libuv运行的API。    enter image description here

所有收集的请求都分布在这些不同的事件队列中。顶部的队列具有最高优先级,底部的队列具有最低优先级。

因此,事件循环首先检查计时器队列,并且如果有事件准备好传递给调用堆栈并执行其回调,事件循环将对其进行处理。在使用计时器队列完成事件循环之后,但是在跳转到下一个队列之前,事件循环将查看由节点本身运行的其他2个队列,并将首先处理这些队列。这些是:

Next Ticks Queue” —使用process.nextTick函数添加的回调 其他微任务队列-包括其他微任务,例如已解决的Promise回调,console.log等。

使用这2个队列完成事件循环后,它将移至下一个队列,即I / O回调。

请注意,Node事件循环是单线程的。但是,对于计算量大或耗时的任务,libuv具有线程池,默认情况下它具有4个池,而不是阻塞事件循环。使用此线程池的只有四件事-DNS查找,fs,crypto和zlib。不论是否阻塞,其他所有事情都在主线程中执行。

到目前为止,我们已经有了事件循环,该循环处理libuv为其他某些功能运行的事件队列和线程池中的事件。节点标准库还具有一些功能,这些功能利用了通过libuv内置到底层操作系统中的代码。所有现代操作系统都提供了与libuv进行交互的API。

Libuv将诸如网络I / O和fs模块的功能之类的任务委托给操作系统,因此OS会运行这些任务并将结果传递给Libuv。