Node.js

[NodeJS] process.nextTick()과 setImmediate(), setTimeout()

SongMinu 2022. 9. 2. 17:48
728x90

process.nextTick()

현재 진행 중인 작업의 완료 시점 뒤로 함수의 실행을 지연시킨다.

콜백을 인수로 취하여 대기 중인 I/O 이벤트 대기열의 앞으로 밀어 넣고 즉시 반환한다.

현재 진행중인 작업이 제어를 이벤트 루프로 넘기는 즉시 콜백이 실행된다.

process.nextTick()으로 지연된 콜백은 마이크로태스크라 불리며, 현재의 작업이 완료된 후에 바로 실행되며 다른 I/O 이벤트가 발생하기 전에 실행된다.

이미 예정된 I/O 보다 먼저 실행되기 때문에 재귀 호출과 같은 특정 상황에서 I/O 기아(starvation)을 발생시킬 수 있다.

setImmediate()와 setTimeout()

process.nextTick()과 목적은 유사하지만 그 의미는 다르다.

이미 큐에 있는 I/O 이벤트들의 뒤에 대기하게 된다.

특정 상황에서는 setImmediate로 예약된 콜이 setTimeout으로 예약된 것보다 빨리 실행된다.

function run1(a, b, cb) {
  setImmediate(() => cb(a + b), 100);
}

function run2(a, b, cb) {
  process.nextTick(() => cb(a + b));
}

function run3(a, b, cb) {
  setTimeout(() => cb(a + b), 100);
}

run3(3, 4, rs => {
  console.log(`Run3 : ${rs}`);
});
run1(1, 2, rs => {
  console.log(`Run1 : ${rs}`);
});
run1(3, 4, rs => {
  console.log(`Run1 : ${rs}`);
});
run2(10, 10, rs => {
  console.log(`Run2 : ${rs}`);
});
run1(5, 6, rs => {
  console.log(`Run1 : ${rs}`);
});
run3(3, 4, rs => {
  console.log(`Run3 : ${rs}`);
});

각 콜백 함수들을 실행시키는 위치를 변경시켜보면 process.nextTick()이 항상 먼저 실행된다.

반응형