본 문서에서는 아래에 있는 여러가지 Phase Queue에 따른 이벤트 루프의 실행 순서에 대한 차이에 대해 다룬다. 아래 페이즈는 위에서 아래의 순서로 진행되며, close callbacks페이즈에 이르면 timers 페이즈로 돌아간다.
최종수정일 : 2023.06.08
각각의 페이즈에서 처리하는 일은 다음과 같다.
PHASE | MEMBER | FUNCTION |
---|---|---|
timers | setTimeout() setInterval() | execute callback function if no delay left |
pending Callbacks | - | - |
idle, prepare | - | - |
poll | I/O | execute callback function |
check | setImmediate() | manually-added callback function |
close callbacks | - | - |
입출력 이벤트가 없는 경우
스크립트 내 임의의 위치가 현재의 페이즈일 수 있어 어느 페이즈가 실행되고 있는지 확실하지 않다. 따라서 이러한 경우 timers와 check중 어느 쪽이 먼저 실행될 지는 불확실하다.
입출력 이벤트가 있는 경우
입출력 이벤트가 끝난 경우의 페이즈는 poll에 있으므로, check가 timer보다 늘 먼저 실행된다.
nextTick이 있는 경우
nextTick queue는 이벤트 루프 바깥에 존재하며, 해당 큐에 있는 작업은 이벤트루프의 각 페이즈 큐 사이에 실행된다.
// Execute setTimeout(() => console.log('timeout'), 0); setImmediate(() => console.log('immediate')); process.nextTick(() => { setTimeout(() => console.log('timeout2'), 0); setImmediate(() => { process.nextTick(() => console.log('next tick2')); console.log('immediate2'); }); console.log('next tick'); }); // Output next tick timeout timeout2 immediate immediate2 next tick2
STEP 01
timers queue에 setTimeout이(실질적으로 0ms는 1ms로 변경됨), check queue에 setImmediate가, nextTick queue에 nextTick이 등록됨
STEP 02
nextTick이 가장 먼저 실행되고, nextTick 내의 setTimeout과 setImmediate이 각각 큐에 올라감.
STEP 03
이벤트 루프를 돌며 timers queue, check queue가 각각 실행되며, check queue 내의 setImmediate에 있던 nextTick이 마지막에 실행된다.
(Tistory-Inpa Dev : 이벤트 루프 setTimeout / setImmediate / process.nextTick 차이점)