NodeJS事件循环中的轮询阶段

Krr*_*Raj 7 javascript event-loop node.js

我正在通过节点文档进行事件循环,我感到非常困惑.它说 -

timers: this phase executes callbacks scheduled by setTimeout() and 
setInterval().
I/O callbacks: executes almost all callbacks with the exception of close callbacks, the ones scheduled by timers, and setImmediate().
idle, prepare: only used internally.
poll: retrieve new I/O events; node will block here when appropriate.
check: setImmediate() callbacks are invoked here.
close callbacks: e.g. socket.on('close', ...).
Run Code Online (Sandbox Code Playgroud)

然后在详细的轮询阶段,他们说它执行使用计时器调度的计时器,并且还处理轮询队列中的i/o事件.我的困惑是,我们已经有那些回调的计时器阶段和i/o回调阶段,然后轮询阶段完成的工作是什么.它还说线程可能在轮询阶段睡觉,但我没有正确.
我的问题是 -

  1. 当我们已经有定时器和i/o回调阶段时,为什么轮询阶段正在执行定时器和i/o的脚本?
  2. 是否轮询阶段代表定时器执行回调和i/o回调阶段和定时器和回调阶段仅用于内部处理在此阶段没有执行回调?
  3. 我们在哪里可以将承诺放在这个循环中?之前我认为promises可以简单地认为是回调,我们可以将它们视为回调,但是在这个视频中,他说promises会进入内部事件循环,但是没有详细说明.

在这一点上我很困惑.任何帮助将不胜感激.

sle*_*man 10

poll阶段归结为异步 I/O 等待。Libuv 将根据操作系统使用不同的 API,但它们通常都具有相同的模式。我将使用select()作为一个例子。

基本上是poll这样的系统调用:

select(maxNumberOfIO, readableIOList, writableIOList, errorIOList, timeout);
Run Code Online (Sandbox Code Playgroud)

该函数会阻塞。如果没有timeout指定值,它将永远阻塞。

结果是,只要没有 I/O 活动,node.js 将无法执行任何 javascript。这显然使得不可能执行基于时间的回调,如setTimeout()setInterval()

因此,节点在调用这样的函数之前需要做的就是计算要传递什么值timeout。它通常通过遍历所有计时器的列表并计算出可以等待 I/O 的最短时间(下一个最近的计时器)并将其用作超时值来实现此目的。它基本上处理所有计时器,但不执行它们的回调,它是为了计算等待时间。


小智 1

我自己刚刚读到过这一点。就计时器而言,有关事件循环的文档以示例的形式给出了不错的答案。假设 setTimeout 计时器设置为在 100 毫秒后触发,但 I/O 进程正在进行中(在轮询阶段)并且需要超过 100 毫秒才能执行,例如 150 毫秒。一旦完成,轮询阶段将返回到计时器阶段,并在比预期 100 毫秒晚(即 150 毫秒)执行 setTimeout。

希望这有助于回答轮询阶段与计时器阶段的关系。本质上,据我了解,轮询阶段可以在必要时“做出决定”再次运行计时器阶段。


归档时间:

查看次数:

973 次

最近记录:

6 年,9 月 前