2013-08-21 3 views
0

Помогите мне взяться. Это код:setimeout блокирует цикл событий Nodejs, проверяя следующий пример:

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 или в сервере узла, то сообщение, что дисплей не apropiate. Сообщение, которое отображается: 1000 и 3188 -> Вот проблема, потому что это будет 1000,2000. Почему вторая консольная консоль задержки запускается? Как я могу управлять таймерами в nodejs ??

IN NODEJS: Как я могу это сделать, если мне нужно вызвать задачу ровно за 2 секунды до первой задачи, независимо от длительности первой задержки.

+2

JavaScript все еще однопоточный. Ваши циклы 'for' занимают одну секунду, чтобы закончить, что задерживает выполнение второго обратного вызова' setTimeout' на тот же самый промежуток времени. – Blender

ответ

2

Выполнение JavaScript по-прежнему однопоточно в Node.js. Пока петли for сохраняют этот поток занятым, 2 function и console.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 
+0

Фактически, в js хранятся события в очереди FIFO и выполняются один за другим, поэтому, если одно событие занимает больше времени, это задерживает следующие! – AhmadF

0

Это потому, что код не является параллельной и функции SetTimeout добавить код в очереди, которая будет выполняться, когда это возможно.

И MDN говорят, что:

задержка в миллисекундах (тысячные доли секунды), которые называют функции должны быть задержаны. Фактическая задержка может быть более длинной

Смежные вопросы