最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

每秒奇怪的结果测试操作

运维笔记admin10浏览0评论

每秒奇怪的结果测试操作

每秒奇怪的结果测试操作

我在节点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时有更多的迭代。在这种情况下,它可能与事件循环的速度有关,这取决于程序的负载。

与本文相关的文章

发布评论

评论列表(0)

  1. 暂无评论