settimeout阻塞事件循环Nodejs检查下一个例子:

时间:2013-08-21 07:27:53

标签: javascript node.js real-time scalability

帮助我。 这是代码:

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 - &gt;这是问题,因为这将是1000,2000。为什么第二个console.log命令延迟执行?我如何在nodejs中管理定时器??

IN NODEJS: 如果我需要在第一个任务前2秒完全触发任务,那么我怎么能做到这一点,在第一次延迟的很长时间内完成。

2 个答案:

答案 0 :(得分:2)

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

John Resig对“How JavaScript Timers Work”中的计时器有一个很好的解释。

  

如果我需要在第一个任务之前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

答案 1 :(得分:0)

那是因为代码不是并行的,而setTimeout函数会将代码添加到将要执行的队列中。

MDN说:

  

延迟是毫秒(千分之一秒)的数量   函数调用应该延迟。实际延迟可能更长