settimeout正在阻塞事件循环Nodejs检查下一个示例:

settimeout is blocking event-loop Nodejs check the next example:

本文关键字:下一个 检查 Nodejs 循环 事件 settimeout      更新时间:2023-09-26

帮助我。这是代码:

var start = Date.now();
setTimeout(function () {
    console.log(Date.now() - start);
    for (var i = 0; i < 1000000000; i++){}
    for (var i = 0; i < 1000000000; i++){}
}, 1000);
setTimeout(function () {
    console.log(Date.now() - start);
}, 2000);

当在REPL或节点服务器中运行此代码时,显示的消息不是正确的。显示的消息是:1000和3188-->这是问题所在,因为这将是10002000。为什么第二个console.log命令延迟执行??如何在nodejs中管理Timers??

在NODEJS中:如果我需要在第一个任务前2秒触发一个任务,那么我该怎么做呢。

Node.js中的JavaScript执行仍然是单线程的。只要for循环使该线程繁忙,第二个functionconsole.log()就必须等待。

John Resig在"JavaScript定时器的工作原理"中对定时器做了很好的解释

如果我需要在第一个任务前2秒触发一个任务,那么我该怎么做呢。

您可以将运行时间较长的同步任务(在本例中为for循环)移动到自己的模块中,并使用child_process.fork()来执行它

// long-running.js
var start = Number(process.argv[2]);
for (var i = 0; i < 1000000000; i++){}
for (var i = 0; i < 1000000000; i++){}
console.log('3', Date.now() - start);
var child_process = require('child_process');
var start = Date.now();
setTimeout(function () {
    console.log('1', Date.now() - start);
    child_process.fork('./long-running', [start]);
}, 1000);
setTimeout(function () {
    console.log('2', Date.now() - start);
}, 2000);
// output
1 1013
2 2016
3 3395

这是因为代码不是并行的,setTimeout函数会将代码添加到队列中,并在可能的时候执行。

MDN说:

延迟是指函数调用应该延迟。实际延迟可能更长