为什么NodeJS在调查阶段会阻止自己?

时间:2019-03-08 09:44:36

标签: node.js

来自docs

  

阶段概述

  1. timers:此阶段执行由setTimeout()和 setInterval()。
  2. 待处理的回调:执行延迟到的I / O回调 下一个循环迭代。
  3. 空闲,准备:仅在内部使用。
  4. poll:检索新的I / O事件;执行与I / O相关的回调(几乎所有 除了close回调,计时器安排的回调, 和setImmediate());适当时,节点将在此处阻塞。
  5. 检查: setImmediate()回调在这里被调用。关闭回调:一些
  6. 关闭回调,例如socket.on('close',...)。
  

在事件循环的每次运行之间,Node.js检查它是否在等待   用于任何异步I / O或计时器,如果有的话,可以干净地关闭   没有。

我听不懂第四个子弹。特别是“ 节点行将在适当的时候在此处阻塞。

在哪种情况下,节点会自身阻塞,为什么?

1 个答案:

答案 0 :(得分:0)

如本section中所述,轮询阶段将计算阻塞并等待I / O多长时间。 因此,在此阶段,如果超过了在计时器阶段计算的时间阈值,它将从计时器执行回调。

如果未超过计时器阈值并且轮询队列不为空,则事件循环将迭代通过其同步执行回调的回调队列,直到该队列用尽或达到与系统相关的硬限制为止。 / p>

如果轮询队列为空,则会发生以下两种情况之一:

1-如果脚本已由setImmediate()安排,则事件循环将结束轮询阶段,并继续执行检查阶段以执行那些计划的脚本。

2-如果setImmediate()尚未安排脚本,则事件循环将等待回调添加到队列中,然后立即执行它们。