node.js - setTimeout 在 Linux 上精确但在 Windows 上不精确?

标签 node.js timer settimeout

我有一个简单的 setTimeout 用法:

var oldDate = new Date().getTime();

setInterval(function(){
    var newDate = new Date().getTime();

    console.log(newDate - oldDate, 'ms');

    oldDate = newDate;
}, 7);

这会在带有 Node(v10.15.2) 的 Linux 系统上打印:

8 'ms'
6 'ms'
8 'ms'
7 'ms'
8 'ms'
8 'ms'

但是在带有 Node(v10.15.1) 的 Windows 系统上:

21 'ms'
22 'ms'
20 'ms'
20 'ms'
17 'ms'
23 'ms'
18 'ms'
20 'ms'
22 'ms'
17 'ms'
17 'ms'
22 'ms'
19 'ms'
20 'ms'
23 'ms'
19 'ms'
30 'ms'

这绝对是一团糟,并且运行非常随机。

我需要一个精确且无阻塞的计时器。在 Linux 中它就像一个魅力,但我很好奇,为什么它在 Windows 中那么糟糕?

谢谢!

最佳答案

您不能使用计时器子系统进行精确计时。

重要的是要了解,即使在 Linux 上,只有 Node.js 实例的主线程从不忙于执行其他操作(例如处理 I/O 完成或运行某些 JavaScript 逻辑)时,它才会“精确”。 Node.js 程序中只有一个主线程(您可以通过 Worker 有其他主线程),它处理 I/O 完成回调以及代码执行的任何其他操作(除非它位于工作线程上)。 setTimeout/setInterval 在任务队列中安排正常任务,该队列还保存其他任务(例如 I/O 完成)。

如果您确实需要如此精确的计时,您可能至少需要将其移动到工作线程,即使如此,它也可能不精确。如果没有,您可能会使用 setImmediate 循环来更接近。如果这还不够接近,您可能需要在工作线程中忙等待(这将固定 CPU 核心,但至少不是主线程)。

关于node.js - setTimeout 在 Linux 上精确但在 Windows 上不精确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57942804/

相关文章:

node.js - Node : Get dependencies licence

node.js - allowNull :false and required:true did not validate null string input

node.js - 如何在 Node.js 中无限读取行

javascript - 定期测试页面加载后添加到 DOM 的元素

ios - 如何在关闭 ViewController 后继续倒计时

javascript - Jquery 设置计数器,但在调用函数时重置

javascript - 递归 setTimeout 调用是否会导致闭包链内存泄漏?

node.js - 如何在 Bluemix 中部署的 Node 应用程序中执行 Linux 进程?

javascript:全 Angular 居中动画 slider

javascript - 函数内javascript中的setTimeout