NodeJS setImmediate循环:事件循环每次迭代仅执行一个回调吗?
setImmediate在Node.js事件循环中的执行逻辑
先看你给出的示例代码:
function loop() { // 这里可以放任何要循环执行的代码 setImmediate(loop); } loop();
问题解答
- 事件循环每次迭代只会执行一个setImmediate回调吗?
不是绝对的,但在你的示例场景里,loop()确实会在事件循环的每次迭代中仅运行一次。
Node.js事件循环进入Check阶段时,会执行该阶段队列中已有的所有回调,直到队列耗尽或者达到最大回调执行数。但要注意:在回调执行过程中新添加的setImmediate回调(比如你的loop()里调用setImmediate(loop)),会被放入下一轮事件循环的Check队列,不会在当前阶段被处理。所以你的loop()每次只会在当前循环的Check阶段执行一次,新的回调要等下一轮循环才会触发。
- 如何确定每个tick会执行多少个setImmediate回调?
默认情况下,Node.js会执行Check队列里的所有回调直到耗尽。如果有特殊的性能调优需求,可以通过--immediate-callbacks命令行参数设置每个Check阶段允许执行的最大回调数,日常开发中一般不需要修改这个参数。
另外,你听到的“setImmediate用于在下一个tick运行回调”是简化表述,准确来说,它的回调会在当前循环的Poll阶段结束后进入Check阶段执行(如果Poll阶段没有等待的I/O事件)。
官方文档说明:"一般来说,当事件循环进入某个阶段时,它会执行该阶段特有的操作,然后执行该阶段队列中的回调,直到队列耗尽或达到最大回调执行数。"
内容的提问来源于stack exchange,提问作者regna
相关产品推荐
相关产品推荐

