nodejs 학습중 setTimeout
및 setImmediate
에 대한 의문이 들어 관련 내용을 찾아보았다.
setTimeout(() => {
console.log('timeout')
}, 0);
setImmediate(() => {
console.log('immediate')
});
위 코드를 실행하면, 다음과 같은 결과가 나온다.
// 1차
timeout
immediate
// 2차
immediate
timeout
위처럼, 실행을 할때마다 다른 결과가 나온다.
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 실행)
위와 같은 결과를 도출하게 된다.
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을 실행하게 된다.
출처