-
The Node.js Event Loop, Timers, and process.nextTick() 문서 읽고 알게 된 내용Web Dev/4. Node Js 관련 2021. 2. 15. 14:22728x90
읽은 문서
nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
정리하기 전에
- Call stack: JavaScript keeps track of what function is being run and where it was run from. Whenever a function is to be run, it's added to the call stack.
- Callback queue: any functions delayed from running(and run automatically by Node) are added to the callback queue when the background Node task has completed(or there's been some activity like a request)
- event loop: determines what function/code to run next from the queue(s)
사실은 큐가 종류가 많다.
But Node is most powerful because of the automated JS function execution triggered by Node at just the right moment. This means we don't have to wait in JS for the right moment to run code and block any other code running. But it also means we better know intimately how to decides what to automatically execute at what moment.
정리한 내용
이벤트 루프란?
- 이벤트 루프가 Node.js에서 non-blocking I/O operations을 할수 있게 해준다. (JS가 싱글 스레드임에도 불구하고). 연산을 시스템 커널로 내려버릴 수 있기 때문이다.
- 현대의 커널들은 multi-threaded이기 때문에 여러 연산을 백그라운드에서 처리할 수 있고, 연산 중에 하나가 끝나면 커널은 Node에게통보를한다. 그러면 Node는 적절한 콜백을 아마도 Poll 큐에 추가한다.
이벤트 루프에 대한 설명
Node.js가 시작되면, event loop를 초기화한다. 그리고 입력된 스크립트-어쩌면 비동기 API 콜을 하거나, 타이머를 스케줄 하거나, process.nextTick()을 호출할지도 모르는-를 처리한다. 그리고 이벤트 루프를 처리하기 시작한다.
각 Phase는 FIFO 큐이고, 실행할 콜백들이 들어있다. 각 phase는 제각각 특별한데, 이벤트 루프가 각 phase에 진입하면, 큐가 다 빌때까지 콜백을 실행하거나 최대 콜백 갯수까지 실행한다. 큐가 비었거나, 콜백 제한에 걸리면, 이벤트 루프는 다음 phase로 이동한다.
각 큐의 역할
- timer 큐: setTimeout이랑 setInterval로 스케쥴 된것을 처리한다.
x -pending callbacks: 다음 이벤트 루프 이터레이션으로 미뤄진 콜백실행
x - idle, prepare: 내부적으로 쓰이는거라 우리는 건들지 않는다
- poll queue(I/O 큐): 95프로의 콜백은 여기로 온다. 새로운 I/O 이벤트를 가져와서 이 콜백을 처리한다.
- check: setTimeout 의 콜백이 여기로 온다. poll queue가 다 실행된걸 보장하고 실행한다. 이름은 setImmediate인데 절대로 immediate하게 실행을 안한다. 무조건 큐중에 제일 마지막에 실행된다. 메소드이름 중에 역대급 망작.
x - close callbacks: 몇몇의 close callback을 실행(가장 후순위이다)
(중요)
MicroTask Queue라는 것도 있는데, 이건 다른 큐를 가기전에계속 확인을 하는 큐이다.
이 큐에는 process.nextTick에 들어가는 내용과, promise를 통해 처리되는 내용이 들어간다.
각 큐로 넘어갈때 항상 이 큐를 확인한다.
setImmediate(() => { console.log("immediate"); }) process.nextTick(() => { console.log("nextTick") }) setTimeout(() => { console.log("Timeout") }, 0) Promise.resolve().then(() => { console.log("Promise") })
Promise와 nextTick은 마이크로 태스크라고 따로 구분지어 부르고 다른 콜백들보다 항상 우선시 된다. 각 큐에서 다음 큐로 이동할때 항상 실행된다.
'Web Dev > 4. Node Js 관련' 카테고리의 다른 글
Npx to run command of locally installed packages (0) 2021.02.23 nvm과 volta (0) 2021.01.26