이벤트 루프와 setImmediate 및 setTimeout의 실행 순서
2024. 11. 15. 23:27ㆍ정보처리,전산/NODEJS
반응형
const fs = require('fs');
// fs.readFile은 비동기 I/O 작업이다. 파일을 읽은 후 콜백을 실행한다.
fs.readFile(__filename, () => {
// 이 안에서 setTimeout과 setImmediate를 호출한다.
setTimeout(() => {
console.log('timeout');
}, 0);
setImmediate(() => {
console.log('immediate');
});
});
- fs.readFile 호출:
- fs.readFile은 비동기적으로 파일을 읽는다. 이때 파일을 읽는 작업은 Node.js의 libuv 라이브러리에 의해 처리된다.
- 파일을 읽는 동안 Node.js는 다른 작업을 처리할 수 있으며, 파일을 읽는 작업이 완료되면 이벤트 루프의 Pending I/O Callbacks Phase로 돌아간다.
- setTimeout과 setImmediate:
- 파일을 다 읽은 후 setTimeout과 setImmediate가 실행된다.
- setTimeout은 타이머 큐에 콜백을 추가하고, setImmediate는 Check phase에 콜백을 추가한다.
- 이벤트 루프 흐름:
- 이벤트 루프는 Phases를 순차적으로 진행한다:
- Timers Phase: setTimeout, setInterval의 콜백을 실행한다.
- I/O callbacks Phase: fs.readFile 같은 비동기 I/O 작업의 콜백을 실행한다.
- Idle, Prepare Phase: 내부적으로 사용된다.
- Poll Phase: 대부분의 비동기 I/O 이벤트가 이곳에서 처리된다.
- Check Phase: setImmediate 콜백이 실행되는 곳이다.
- Close callbacks Phase: process.on('exit') 등 종료 관련 콜백이 실행된다.
- 이벤트 루프는 Phases를 순차적으로 진행한다:
- 왜 setImmediate가 먼저 실행되나요?
- setImmediate는 항상 Check Phase에서 실행되며 I/O 작업이 완료된 직후에 실행된다.
- 반면, setTimeout은 Timers Phase에서 실행되며, setTimeout의 콜백은 해당 타이머의 시간이 만료될 때 실행된다. setTimeout의 콜백은 항상 Timers Phase에 등록된다.
- 즉, setImmediate는 I/O 작업이 완료된 후 바로 실행되는 구조이고, setTimeout은 타이머가 만료된 후 실행되므로, 타이머 큐에서 대기하고 이벤트 루프의 타이머 단계에서 실행된다.
실행 순서:
- fs.readFile이 시작된다. 이벤트 루프는 이 작업을 비동기적으로 처리하고, 작업이 끝날 때까지 다른 작업을 처리할 수 있다.
- setTimeout(0)과 setImmediate가 호출된다. setTimeout은 Timers Phase에, setImmediate는 Check Phase에 등록된다.
- 파일을 읽은 후 Pending I/O callback phase에서 fs.readFile의 콜백이 실행된다.
- 이벤트 루프는 Check Phase로 넘어가며 setImmediate의 콜백을 실행한다.
- 이벤트 루프는 Timers Phase로 넘어가며 setTimeout(0)의 콜백을 실행한다.
immediate
timeout
왜 setImmediate가 먼저 실행되는지:
- setImmediate는 setTimeout보다 우선적으로 실행된다. 왜냐하면 setImmediate는 I/O 작업이 완료된 후 바로 실행되도록 설계되어 있기 때문이다. 반면 setTimeout은 타이머가 만료된 후 실행된다.
- 이로 인해 setImmediate는 Check phase에서 처리되고, setTimeout은 Timer phase에서 처리되기 때문에 setImmediate가 먼저 실행된다.
반응형
'정보처리,전산 > NODEJS' 카테고리의 다른 글
POST 요청을 처리하여 데이터를 서버의 객체에 업데이트 (0) | 2024.11.17 |
---|---|
간단한 HTTP 서버를 만드는 기본적인 Node.js (0) | 2024.11.17 |
이벤트 루프 (Event Loop) (0) | 2024.11.15 |
HTML 내에서 메뉴 클릭 이벤트를 처리 (0) | 2024.11.15 |
Promise.race() 메서드 (0) | 2024.11.15 |