- node.js/
- Node.js 为什么NodeJS在轮询阶段会阻止自己?
Node.js 为什么NodeJS在轮询阶段会阻止自己?
Node.js 为什么NodeJS在轮询阶段会阻止自己?,node.js,Node.js,发件人:
阶段概述
计时器:此阶段执行setTimeout()和
setInterval()
挂起回调:执行延迟到的I/O回调
下一个循环迭代
空闲,准备:仅在内部使用
轮询:检索新的I/O事件;执行与I/O相关的回调(几乎所有
除了关闭回调(由计时器安排的回调)之外,
和setImmediate());适当时,节点将在此阻塞
检查:
这里调用setImmediate()回调。关闭回调:一些
关闭回调,例如socket.on('close',…)
在每次运行事件循环之间,Node.js检查它是否
发件人:
阶段概述
计时器:此阶段执行setTimeout()和
setInterval()李>
挂起回调:执行延迟到的I/O回调
下一个循环迭代李>
空闲,准备:仅在内部使用李>
轮询:检索新的I/O事件;执行与I/O相关的回调(几乎所有
除了关闭回调(由计时器安排的回调)之外,
和setImmediate());适当时,节点将在此阻塞李>
检查:
这里调用setImmediate()回调。关闭回调:一些
关闭回调,例如socket.on('close',…)
在每次运行事件循环之间,Node.js检查它是否正在等待
对于任何异步I/O或计时器,如果有
没有
我听不懂第四颗子弹。尤其是行“节点将在适当的时候在此阻塞。”
在什么情况下节点会阻塞自身以及为什么会阻塞?如本节所述,轮询阶段计算节点阻塞和等待I/O的时间。
所以,在这个阶段,若在定时器阶段计算的时间阈值被越过,它将执行来自定时器的回调
如果未超过计时器阈值,并且轮询队列不为空,则事件循环将迭代其回调队列,同步执行回调,直到队列耗尽或达到系统相关的硬限制
如果轮询队列为空,则会发生以下两种情况之一:
1-如果setImmediate()已计划脚本,则事件循环将结束轮询阶段并继续到检查阶段以执行这些计划脚本
2-如果setImmediate()未计划脚本,事件循环将等待回调添加到队列中,然后立即执行它们。