Node.js: process.nextTick() vs setImmediate()

Есть важное отличие между process.nextTick и setImmediate. Вызов nextTick добавляет событие в начало очереди и оно выполнится первым после завершения текущего цикла событий. setImmediate добавляет событие в конец.

Например если вы разбили большую функцию на несколько частей и в конце каждой части вызываете следующую через nextTick - то это совершенно бесполезно, поскольку никакое другое событие все равно обработано не будет, пока все части вашей функции не отработают. А вызов через setImmediate позволит втиснутся другим обработчикам

Пример

вот программа которая выполняет подсчет сложного хэша, типа блокчейна или вроде того, когда каждый последующий элемент включает в себя предыдущий.

const crypto = require('crypto');
var s='start';
var num=0;

setInterval(()=>{
    num++;
    console.log(`Incomming call ${num}`);   
}, 1000);

function makeCB(i) {
    return ()=>{
      console.log(`i = ${i}`);
        for (var j=0;j<1000;j++) {
            var hash = crypto.createHash('sha256');
            hash.update(s+i+''+j);      
            s=hash.digest('hex');
        }
    }
}

var arr=[];
for(var i=0;i<1000;i++) {
    arr.push(makeCB(i));
}

function step(){
    var func=arr.shift();
    if (func) { 
        func();
        process.nextTick(step);
        //setImmediate(step);
    }
}

step();

console.log(s);

Когда используется nextTick, события от таймера начнут обрабатываться только после завершения расчета хэша. Если setImmediate - расчет хэша не помешает обработке событий таймера.

Следствие

Использование setImmediate предпочтительнее. А использование nextTick может привести к неожиданным тормозам когда необходима параллельная обработка запросов - программа будет выглядеть как асинхронная, но фактически выполняться синхронно.

программированиеnodejsnextticksetimmediate
8
0 GOLOS
0
В избранное
alessandro
На Golos с 2017 M10
8
0

Зарегистрируйтесь, чтобы проголосовать за пост или написать комментарий

Авторы получают вознаграждение, когда пользователи голосуют за их посты. Голосующие читатели также получают вознаграждение за свои голоса.

Зарегистрироваться
Комментарии (0)
Сортировать по:
Сначала старые