setInterval NodeJS正在添加额外的时间

时间:2017-09-10 12:52:46

标签: javascript node.js

为什么本地setInterval函数在〜每个新函数调用之后增加1毫秒,这将由间隔触发?

这是我将API固定至少20次后得到的日志:

2017-09-10T12:42:56.568Z INFO: Pinging API
2017-09-10T12:42:58.569Z INFO: Pinging API
2017-09-10T12:43:00.569Z INFO: Pinging API
2017-09-10T12:43:02.570Z INFO: Pinging API
2017-09-10T12:43:04.570Z INFO: Pinging API
2017-09-10T12:43:06.571Z INFO: Pinging API
2017-09-10T12:43:08.571Z INFO: Pinging API
2017-09-10T12:43:10.571Z INFO: Pinging API
2017-09-10T12:43:12.572Z INFO: Pinging API
2017-09-10T12:43:14.572Z INFO: Pinging API
2017-09-10T12:43:16.572Z INFO: Pinging API
2017-09-10T12:43:18.573Z INFO: Pinging API
2017-09-10T12:43:20.574Z INFO: Pinging API
2017-09-10T12:43:22.574Z INFO: Pinging API
2017-09-10T12:43:24.575Z INFO: Pinging API
2017-09-10T12:43:26.576Z INFO: Pinging API
2017-09-10T12:43:28.576Z INFO: Pinging API
2017-09-10T12:43:30.576Z INFO: Pinging API
2017-09-10T12:43:32.577Z INFO: Pinging API
2017-09-10T12:43:34.577Z INFO: Pinging API

目前我的代码只是在回调函数中执行以下操作:

setInterval(() => {
    // this just logs the info
    logger.info('Pinging API') 
}, 2000)

我希望有人可以解释我,当重置间隔以及为什么它在毫秒基础上不可靠(更不用说纳秒级)?

2 个答案:

答案 0 :(得分:2)

一些自我测试:

拿一张纸,将所有方块写在上面,例如 1,4,9,16 ...... ,然后拿一个时钟,每隔10秒敲桌子。

在执行第一个数字时很容易,您可以轻松地multithread(不是多任务)。然而,当数学变得更复杂时,你会忘记敲门而且你忙于计算。

这与处理器有什么关系?

计算机同时运行几千个作业。它显示时间,更改背景图像,加载更新,清理RAM等。为此,它执行多线程,因此它每秒在作业(线程)之间更改几次。所以看起来它同时也是这样。

计时器会发生什么?

计算机有hardwareside timers。 当计时器完成时,它 interrupts当前进程(如果可能!)并继续处理计时器(记录一些东西)。

如果可能的话?

中断进程需要时间(切换RAM pages,清理注册表),就像人类可能忙于计算计算机一样。同样interrupting too often可能会导致livelock。这就是为什么计时器不准确,因为计算机等待目前正在进行的工作,直到context change为止。说实话:谁在乎这个毫秒?

答案 1 :(得分:0)

setIntervalsetTimeout不保证在准确的时间内执行回调,您可以在此页面中阅读其api文档setTimeout#Reasons_for_delays_longer_than_specified