로우 레벨로 살펴보는 Node.js 이벤트 루프
Evan-moon
지난 요약글에서 간략히 다루었던 이벤트 루프 내 6 페이즈의 이벤트 큐에 대하여 조금 더 자세히 살펴본 포스팅이 있어 요약해보고자 합니다.
(6 단계에 대한 간략한 설명은 지난 글을 참고해주시거나, 아래 포스팅을 참고해주시면 됩니다)
참고문헌
https://evan-moon.github.io/2019/08/01/nodejs-event-loop-workflow/
요약
이벤트 루프의 구조와 실행
앞선 요약글에서 이벤트 루프는 자바스크립트 엔진에서 동작하는것이 아니라고 하였습니다. 또한 흔히 알고있는 task queue 역시 한개가 아니라 여러개이며, 각각의 queue 에서는 callback 함수를 실행하게 됩니다. (정확히는 call stack 으로 올려줍니다)
이러한 특징을 고려하여, 실제 js 파일이 node.js 에서 실행되었을 때, 어떠한 흐름을 가지는지 살펴보겠습니다.
js 파일을 실행하게 되면 먼저 이벤트 루프를 활성화할지 하지말지를 결정하게 됩니다. 즉, 비동기 작업 여부에 따라 이벤트 루프의 활성을 결정합니다.
타이머를 비롯해 비동기작업이 필요하다면 이벤트루프가 활성화 됩니다.
가장 먼저 Timer phase 에 돌입하며, 이 단계에서는 setTimeout 등 타이머에 등록된 callback 함수를 실행시킵니다. 어떤 callback 을 실행시킬지 몇 단계를 거쳐 확인합니다.
(페이즈에 돌입한 시간대가 t + 250 이라고 하면, 등록된 100, 200의 딜레이를 가지는 callback 은 실행되며, 그 이상은 실행되지않고 다음 페이즈로 넘어갑니다.)
그 다음은 pending phase 에 들어가며, 이 단계에서는 이전 루프에서 미처 실행하지 못한 callback 들이 있다면 이를 실행시킵니다.
idle phase 를 거쳐 poll phase 에 들어옵니다. 내부 파일읽기나 http 응답 등 처리해야할 작업이 있다면 이를 수행하고, 없다면 상황에 따라 다음 phase 로 이동하게 된다.
만일 check phase 에 수행할 작업이 있다면 check phase 이동
없다면 만일 Timer phase 에 수행할 작업이 있다면, 그 시간까지 대기하다가 Timer phase 로 이동
setImmediate() API 관련 callback 이 존재한다면 위에서 설명한대로 check phase 로 이동하게 됩니다. 이후 callback 을 처리합니다.
여기까지 진행하면 이벤트루프는 계속 활성화 되어야하는지(즉, 남아있는 callback 이 존재하는지) 아니면 종료해야하는지를 결정하게 된다.
또한 이벤트 루프의 일부가 아닌 nextTickQueue, microTaskQueue 의 실행은 매 페이즈가 넘어가는 시점(이를 Tick이라 한다) 마다 가장 우선적으로 처리가 된다.
예를 들어, Timer -> Pending 으로 넘어가는 시점에 nextTickQueue 내 작업이 존재한다면 이를 먼저 수행하게 된다. 이때는 페이즈별 수행 시간이 따로 존재하지 않아 모든 작업을 처리하고 다음 페이즈로 넘어가게 된다.
다음 내용이 궁금하다면?
이미 회원이신가요?
2023년 12월 6일 오전 1:00
어
... 더 보기기
... 더 보기1. 엔터테인먼트 프로덕트의 본질은 콘텐츠다. 사용자는 콘텐츠를 소비하며 감정을 느낀다. 재미, 감동, 공포, 희열. 인간의 다양한 감정이 콘텐츠를 통해 꺼내진다.
MZ가 신상이 아니라 중고 명품에 관심을 갖고 지갑을 본격적으로 연다면서 그 이유를 분석했는데, 그 중 몇몇을 추리면 MZ가 친환경 의식이 높고 소유보다는 '경험'을 추구하고 사용성이라는 소비자 가치를 중시해서라고 그렇단다. 솔직히 그건 그냥 끼워맞춘 것으로 밖에 안보인다. 아무리 넉넉한 마음을 갖고 봐도 아주 매우 지극히 극히 일부는 그럴 수 있다 이해해도 결국 명품 갖고 싶으니깐 핑계에 이유를 붙인거에 가까워보인다.
... 더 보기실
... 더 보기