每秒奇怪的结果测试操作
我在节点8.11
上运行这个测试脚本:
let end = false;
let i = 0;
setInterval(() => { i++; }).unref();
let k = 0;
async function loop() {
k++
if (end === false)
setImmediate(loop);
}
console.time('test');
loop()
.then(() => {
setTimeout(() => {
end = true;
console.log('interval', i);
console.log('recursion', k);
console.timeEnd('test');
}, 1000);
})
输出是:
interval 997
recursion 824687
test: 1001.831ms
但是,如果我评论这两行:
// if (end === false)
// setImmediate(loop);
结果是:
interval 537
recursion 1
test: 1003.882ms
我努力学习phases of nodejs,但我不明白为什么setImmediate
应该影响区间函数的结果。
你有解释吗?
谢谢
回答如下:那是因为nodejs上的定时器在某种意义上并不精确,因为它们只是事件循环中的事件,所以他们无法准确知道它们何时被触发,这就是为什么setTimeout表示它将至少在你提供的时间之后执行。
设置的超时间隔不能依赖于在该精确的毫秒数之后执行。这是因为阻塞或保留在事件循环上的其他执行代码将推迟执行超时。唯一的保证是超时不会比声明的超时间隔更早执行。
当您设置setInmediate时,您正在使用许多中间事件填充事件循环,因此您将超时的事件推回到队列中。
请记住,事件循环周期的持续时间并不相同(确切),因此即使您认为setInmediate不应影响计时器,您也会延长事件周期的持续时间。
有趣的文章:
https://nodejs/en/docs/guides/timers-in-node/
https://medium/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c
编辑:正如您所指出的,在您的情况下,它是相反的,使用setInmediate时有更多的迭代。在这种情况下,它可能与事件循环的速度有关,这取决于程序的负载。
每秒奇怪的结果测试操作
我在节点8.11
上运行这个测试脚本:
let end = false;
let i = 0;
setInterval(() => { i++; }).unref();
let k = 0;
async function loop() {
k++
if (end === false)
setImmediate(loop);
}
console.time('test');
loop()
.then(() => {
setTimeout(() => {
end = true;
console.log('interval', i);
console.log('recursion', k);
console.timeEnd('test');
}, 1000);
})
输出是:
interval 997
recursion 824687
test: 1001.831ms
但是,如果我评论这两行:
// if (end === false)
// setImmediate(loop);
结果是:
interval 537
recursion 1
test: 1003.882ms
我努力学习phases of nodejs,但我不明白为什么setImmediate
应该影响区间函数的结果。
你有解释吗?
谢谢
回答如下:那是因为nodejs上的定时器在某种意义上并不精确,因为它们只是事件循环中的事件,所以他们无法准确知道它们何时被触发,这就是为什么setTimeout表示它将至少在你提供的时间之后执行。
设置的超时间隔不能依赖于在该精确的毫秒数之后执行。这是因为阻塞或保留在事件循环上的其他执行代码将推迟执行超时。唯一的保证是超时不会比声明的超时间隔更早执行。
当您设置setInmediate时,您正在使用许多中间事件填充事件循环,因此您将超时的事件推回到队列中。
请记住,事件循环周期的持续时间并不相同(确切),因此即使您认为setInmediate不应影响计时器,您也会延长事件周期的持续时间。
有趣的文章:
https://nodejs/en/docs/guides/timers-in-node/
https://medium/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c
编辑:正如您所指出的,在您的情况下,它是相反的,使用setInmediate时有更多的迭代。在这种情况下,它可能与事件循环的速度有关,这取决于程序的负载。