Event Loop
이벤트 루프는 node.js가 비동기 이벤트를 관리하고 실행할 수 있게 하는 구현체이다. 이전 글에서 이벤트 루프에 대해 썼는데, 몇몇 단계에 대해 더 깊게 알아보려고 한다.

timers
Timer phase는 이벤트 루프의 시작을 알리는 페이즈이다. 이 페이즈가 가지고 있는 큐에는 setTimeout이나 setInterval 타이머들의 콜백을 저장하게 된다. 이 부분에서 바로 타이머들의 콜백이 큐에 들어가는 것은 아니며 타이머들은 min heap에 들어가 있게 된다. 힙에 만료된 타이머가 있는 경우 이벤트 루프는 연결된 콜백을 가져와서 타이머 대기열이 비어있을 때까지 지연의 오름차순으로 실행을 시작한다.
min heap(최소힙)은 데이터를 이진트리 형태로 관리하며 최소값을 찾아내는데 효율적인 구조이다. 따라서 가장 먼저 실행되는 Timer를 손쉽게 발견할 수 있다.
만약 setTimeout(A function, 1000)을 하면 min heap에서 찾아서 실행하기에 1초가 흐르기 전에 실행되는 것을 방지한다. 딱 1초 후에 실행되는 것은 아니다. 1초 이후에 실행이 된다. 그리고 타이머 콜백의 실행은 poll phase가 제어한다. (javascript의 타이머가 정확하지 않은 이유)
poll phase 처리 후 timer phase로 와서 타이머의 임계값 도달한 것을 확인 후 콜백함수를 실행한다. 예약 중인 타이머와 실행 중인 콜백 사이의 총 지연은 설정 시간보다 길어졌음을 알 수 있다.
Poll
Event Loop가 Poll phase에 들어왔다면 다음과 같은 Queue에 들어있는 일을 처리해준다.
- 데이터베이스 관련 작업으로 인한 결과가 왔을 때 실행되는 콜백
- HTTP 요청으로 인한 응답이 왔을 때 실행되는 콜백
- 파일을 비동기로 읽은 후에 실행되는 콜백
이 과정 또한 Queue가 비거나 시스템의 실행 한도 초과에 다다를 때까지 계속된다.
Poll Phase는 또한 다른 Phase와 다르게 Poll Phase에 일이 다 소진되더라도 바로 다음 Phase로 이동하는 것은 아니다. 이벤트 루프가 Poll 단계에 들어가고 예약된 타이머가 없으면 다음 두 가지 중 하나가 발생한다.
1. 폴 큐가 비어있지 않은 경우 이벤트 루프는 큐가 소진되거나 시스템의 실행 한도에 도달할 때까지 동기적으로 콜백을 실행하는 콜백 큐를 반복한다.
2. 폴 큐가 비어있으면 다음 두 가지 중 하나가 더 발생한다.
- 스크립트가 setImmediate()에 의해 예약된 경우 이벤트 루프는 폴링 단계를 종료하고 예약된 스크립트를 실행하기 위해 check 단계로 계속된다.
- 스크립트가 setImmediate()에 의해 예약되지 않은 경우 이벤트 루프는 콜백이 Queue에 추가될 때까지 기다렸다가 즉시 실행한다.
폴 큐가 비어있으면 이벤트 루프는 시간 임계값에 도달한 타이머를 확인한다. 하나 이상의 타이머가 준비되면 이벤트 루프는 타이머 단계로 돌아가 해당 타이머의 콜백을 실행한다.
폴 큐가 비어 있으면 이벤트 루프는 시간 임계값에 도달한 타이머를 확인한다. 하나 이상의 타이머가 준비되면 이벤트 루프는 타이머 단계로 돌아가 해당 타이머의 콜백을 실행한다.
check
이 단계에서는 Poll 단계가 완료된 직후 콜백을 실행할 수 있다. 폴 단계가 Idle 상태가 되고 스크립트가 setImmediate()를 사용하여 Queue에 지정된 경우 이벤트 루프는 기다리지 않고 check 단계를 계속할 수 있다.
'NODE.JS' 카테고리의 다른 글
[Node.js] Event Emitter (0) | 2024.01.12 |
---|---|
[Node.js] setImmediate()과 setTimeout(), 그리고 process.NextTick() (0) | 2024.01.12 |
[Node.js] Event Loop (이벤트 루프) (0) | 2024.01.12 |
[Node.js] node.js가 비동기를 처리하는 방법 (0) | 2024.01.12 |
[Node.js] package.json 이름 규칙 (String does not match the pattern of "^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$".) (1) | 2024.01.07 |
Event Loop
이벤트 루프는 node.js가 비동기 이벤트를 관리하고 실행할 수 있게 하는 구현체이다. 이전 글에서 이벤트 루프에 대해 썼는데, 몇몇 단계에 대해 더 깊게 알아보려고 한다.

timers
Timer phase는 이벤트 루프의 시작을 알리는 페이즈이다. 이 페이즈가 가지고 있는 큐에는 setTimeout이나 setInterval 타이머들의 콜백을 저장하게 된다. 이 부분에서 바로 타이머들의 콜백이 큐에 들어가는 것은 아니며 타이머들은 min heap에 들어가 있게 된다. 힙에 만료된 타이머가 있는 경우 이벤트 루프는 연결된 콜백을 가져와서 타이머 대기열이 비어있을 때까지 지연의 오름차순으로 실행을 시작한다.
min heap(최소힙)은 데이터를 이진트리 형태로 관리하며 최소값을 찾아내는데 효율적인 구조이다. 따라서 가장 먼저 실행되는 Timer를 손쉽게 발견할 수 있다.
만약 setTimeout(A function, 1000)을 하면 min heap에서 찾아서 실행하기에 1초가 흐르기 전에 실행되는 것을 방지한다. 딱 1초 후에 실행되는 것은 아니다. 1초 이후에 실행이 된다. 그리고 타이머 콜백의 실행은 poll phase가 제어한다. (javascript의 타이머가 정확하지 않은 이유)
poll phase 처리 후 timer phase로 와서 타이머의 임계값 도달한 것을 확인 후 콜백함수를 실행한다. 예약 중인 타이머와 실행 중인 콜백 사이의 총 지연은 설정 시간보다 길어졌음을 알 수 있다.
Poll
Event Loop가 Poll phase에 들어왔다면 다음과 같은 Queue에 들어있는 일을 처리해준다.
- 데이터베이스 관련 작업으로 인한 결과가 왔을 때 실행되는 콜백
- HTTP 요청으로 인한 응답이 왔을 때 실행되는 콜백
- 파일을 비동기로 읽은 후에 실행되는 콜백
이 과정 또한 Queue가 비거나 시스템의 실행 한도 초과에 다다를 때까지 계속된다.
Poll Phase는 또한 다른 Phase와 다르게 Poll Phase에 일이 다 소진되더라도 바로 다음 Phase로 이동하는 것은 아니다. 이벤트 루프가 Poll 단계에 들어가고 예약된 타이머가 없으면 다음 두 가지 중 하나가 발생한다.
1. 폴 큐가 비어있지 않은 경우 이벤트 루프는 큐가 소진되거나 시스템의 실행 한도에 도달할 때까지 동기적으로 콜백을 실행하는 콜백 큐를 반복한다.
2. 폴 큐가 비어있으면 다음 두 가지 중 하나가 더 발생한다.
- 스크립트가 setImmediate()에 의해 예약된 경우 이벤트 루프는 폴링 단계를 종료하고 예약된 스크립트를 실행하기 위해 check 단계로 계속된다.
- 스크립트가 setImmediate()에 의해 예약되지 않은 경우 이벤트 루프는 콜백이 Queue에 추가될 때까지 기다렸다가 즉시 실행한다.
폴 큐가 비어있으면 이벤트 루프는 시간 임계값에 도달한 타이머를 확인한다. 하나 이상의 타이머가 준비되면 이벤트 루프는 타이머 단계로 돌아가 해당 타이머의 콜백을 실행한다.
폴 큐가 비어 있으면 이벤트 루프는 시간 임계값에 도달한 타이머를 확인한다. 하나 이상의 타이머가 준비되면 이벤트 루프는 타이머 단계로 돌아가 해당 타이머의 콜백을 실행한다.
check
이 단계에서는 Poll 단계가 완료된 직후 콜백을 실행할 수 있다. 폴 단계가 Idle 상태가 되고 스크립트가 setImmediate()를 사용하여 Queue에 지정된 경우 이벤트 루프는 기다리지 않고 check 단계를 계속할 수 있다.
'NODE.JS' 카테고리의 다른 글
[Node.js] Event Emitter (0) | 2024.01.12 |
---|---|
[Node.js] setImmediate()과 setTimeout(), 그리고 process.NextTick() (0) | 2024.01.12 |
[Node.js] Event Loop (이벤트 루프) (0) | 2024.01.12 |
[Node.js] node.js가 비동기를 처리하는 방법 (0) | 2024.01.12 |
[Node.js] package.json 이름 규칙 (String does not match the pattern of "^(?:@[a-z0-9-*~][a-z0-9-*._~]*/)?[a-z0-9-~][a-z0-9-._~]*$".) (1) | 2024.01.07 |