为什么本地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)
我希望有人可以解释我,当重置间隔以及为什么它在毫秒基础上不可靠(更不用说纳秒级)?
答案 0 :(得分:2)
一些自我测试:
拿一张纸,将所有方块写在上面,例如 1,4,9,16 ...... ,然后拿一个时钟,每隔10秒敲桌子。
在执行第一个数字时很容易,您可以轻松地multithread(不是多任务)。然而,当数学变得更复杂时,你会忘记敲门而且你忙于计算。
这与处理器有什么关系?
计算机同时运行几千个作业。它显示时间,更改背景图像,加载更新,清理RAM等。为此,它执行多线程,因此它每秒在作业(线程)之间更改几次。所以看起来它同时也是这样。
计时器会发生什么?
计算机有hardwareside timers。 当计时器完成时,它 interrupts当前进程(如果可能!)并继续处理计时器(记录一些东西)。
如果可能的话?
中断进程需要时间(切换RAM pages,清理注册表),就像人类可能忙于计算计算机一样。同样interrupting too often可能会导致livelock。这就是为什么计时器不准确,因为计算机等待目前正在进行的工作,直到context change为止。说实话:谁在乎这个毫秒?
答案 1 :(得分:0)
setInterval
和setTimeout
不保证在准确的时间内执行回调,您可以在此页面中阅读其api文档setTimeout#Reasons_for_delays_longer_than_specified