setTimeout, setImmediate

akanana·2023년 1월 6일
0

개인공부

목록 보기
6/30
post-thumbnail

setTimeout, setImmediate, nextTick


nodejs 학습중 setTimeoutsetImmediate에 대한 의문이 들어 관련 내용을 찾아보았다.

setTimeout vs setImmeidate

setTimeout(() => {
    console.log('timeout')
}, 0);
setImmediate(() => {
    console.log('immediate')
});

위 코드를 실행하면, 다음과 같은 결과가 나온다.

// 1차
timeout
immediate

// 2차
immediate
timeout

위처럼, 실행을 할때마다 다른 결과가 나온다.

Why?


nodejs를 보면 위와 같은 event loop 구조를 가지고 있다.
각각의 phase는 queue 구조를 띄고 있다.

위처럼 setTimeout 및 setImmediate는 각각 timers phase 및 check pahse로 들어간다.
이때 setTimeout은 1ms가 지난 후 실행되므로,

1ms 이전 도착

(timers phase 도착) -> 1ms -> (check phase 도착-setImmediate 실행)

ms 이후 도착

1ms -> (timer phase 도착-setTimeout 실행) - (check phase 도착-setImmediate 실행)

위와 같은 결과를 도출하게 된다.

I/O와 함께 사용시

const fs = require('fs');
fs.readFile('hello.txt', () => {
    setTimeout(() => {
        console.log('timeout')
    }, 0);
    setImmediate(() => {
        console.log('immediate')
    });
});

위 처럼 I/O에서 두 메소드를 호출하면 어떻게 될까?

poll phase로 fs.readFile이 할당된 후, setTimeout 및 setImmediate 가 할당 후 실행된다.
loop를 돌며 check phase를 먼저 접근하게 되므로, immediate를 실행 후 timeout을 실행하게 된다.

출처

0개의 댓글