javascript - NodeJS 事件循环中的轮询阶段

标签 javascript node.js event-loop

我正在通过 Node docs对于事件循环,我感到非常困惑。 它说——

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', ...).

然后在详细的轮询阶段,他们说它执行用定时器调度的定时器,还处理轮询队列中的 i/o 事件。我的困惑是我们已经为这些回调提供了计时器阶段和 i/o 回调阶段,那么轮询阶段完成的工作是什么。它还说线程可能会在轮询阶段休眠,但我没有正确理解它。
我的问题是-

  1. 当我们已经有定时器和 i/o 回调阶段时,为什么 poll 阶段要执行定时器和 i/o 的脚本?
  2. 是不是poll阶段代表timer和i/o callback阶段执行回调,而timer和callback阶段只用于内部处理没有回调在这个阶段执行?
  3. 我们可以在这个循环中的什么地方放置 promise ?早些时候我认为 promises 可以简单地视为回调,我们可以将它们视为回调,但在 this 中视频中,他说 promises 进入内部事件循环,但没有详细讲。

此时我很困惑。任何帮助将不胜感激。

最佳答案

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

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

select(maxNumberOfIO, readableIOList, writableIOList, errorIOList, timeout);

这个功能 block 。如果未指定 timeout 值,它将永远阻止。

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

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

关于javascript - NodeJS 事件循环中的轮询阶段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46485392/

相关文章:

javascript - 为什么这个EventSource会反复触发消息和错误?

node.js - 使用 Passport 和 Passport-azure-ad 时没有刷新 token

c++ - QCoreApplication::processEvents - 为什么必须仅从主线程调用它?

javascript - Google 跟踪代码管理器显示空白页

javascript - TypeScript 中的 querySelectorAll 等效项

javascript - 动态创建元素的延迟加载

javascript - Node 中是否有更好的处理 Mongodb 并发的方法?

滚动控制台窗口时 Node.js 停止

Javascript:使用循环为图像的 URL 填充数组