Event Loop
이벤트 루프는 Node.js가 여러 비동기 작업을 관리하기 위한 구현체
비동기 작업들을 모아서 관리하고 순서대로 실행할 수 있게 해주는 도구
Event Loop 구조

- 각 박스는 특정 작업을 수행하기 위한 페이즈(phase)를 의미한다.
- 그리고 한 페이즈에서 다음 페이즈로 넘어가는 것을 틱 (Tick)이라고 부른다.
- 각 단계에서는 각각의 큐가 있다. 예를 들어서 setTimeout() 함수가 불러지면 timer라는 페이즈에 있는 큐에 쌓이게 된다. 그리고 이 큐는 First In First Out으로 먼저 들어온 게 먼저 나가게 되어있다.
- 그리고 싱글 스레드이기 때문에 timers 페이즈에 있는 일을 끝내거나 최대 콜백 수가 될 때까지 한 후에 다른 단계로 이동하게 된다. (ex. timers 끝내고 pending callbacks로 이동)
- 만약 poll이라는 단계에서 큐에 콜백함수 A가 쌓여있고 A안에 다른 콜백함수 B가 있다면 A 콜백함수 처리 후 B 콜백함수를 다시 poll Queue에 추가한다. 그런데 Node.js가 poll단계를 다시 보고 Q에 B 콜백함수가 남아있으니 그것도 처리한다. 이렇게 다 처리한 후 다음 단계로 넘어간다.
- 이런 식으로 큐에 많이 쌓이면 Node가 계속 추가되는 작업을 처리하느라 다음 페이즈로 못 넘어갈 것 같지만, 페이즈는 시스템 실행한도가 있기에 어느 정도 한도를 넘으면 다른 페이즈로 넘어간다.
Event Loop 각각의 단계 살펴보기
Timer: 이 단계는 setTimeout() 및 setInterval()에 의해 예약된 콜백을 실행한다.
Pending Callbacks: 이 단계에서는 TCP 오류 유형과 같은 일부 시스템 작업에 대한 콜백을 실행한다.
Idle, Prepare: 내부적으로만 사용된다. 이 단계에서 이벤트 루프는 아무 작업도 수행하지 않는다. 유휴 상태 (컴퓨터 시스템이 사용 가능한 상태이나 실제적인 작업이 없는 시간) 이며 다음 단계로 이동할 준비를 한다.
Poll: 대부분의 I/O 관련 콜백을 실행한다. (close 콜백, 타이머에 의해 예약된 콜백 및 setImmediate()를 제외하고 거의 모두.)
Check: 여기에서 setImmediate() 콜백이 호출된다.
Close Callback: 이 단계에서 이벤트 루프는 socket.on('close', fn) 또는 process.exit()와 같은 종료 이벤트와 관련된 콜백을 실행한다.
이벤트 루프의 각 실행 사이에 Node.js는 비동기 I/O 또는 타이머를 기다리고 있는지 확인하고 없는 경우 완전히 종료한다.
참고
2.3 이벤트 루프
> #### 💡 이벤트 루프는 시스템 커널에서 가능한 작업이 있다면 그 작업을 커널에 이관합니다. 자바스크립트가 단일 쓰레드 기반임에도 불구하고 Node.js가 non-block…
wikidocs.net
'NODE.JS' 카테고리의 다른 글
[Node.js] setImmediate()과 setTimeout(), 그리고 process.NextTick() (0) | 2024.01.12 |
---|---|
[Node.js] Event Loop Phase 더 알아보기 (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 |
[Node.js] Blocking과 Non-Blocking (0) | 2024.01.05 |
Event Loop
이벤트 루프는 Node.js가 여러 비동기 작업을 관리하기 위한 구현체
비동기 작업들을 모아서 관리하고 순서대로 실행할 수 있게 해주는 도구
Event Loop 구조

- 각 박스는 특정 작업을 수행하기 위한 페이즈(phase)를 의미한다.
- 그리고 한 페이즈에서 다음 페이즈로 넘어가는 것을 틱 (Tick)이라고 부른다.
- 각 단계에서는 각각의 큐가 있다. 예를 들어서 setTimeout() 함수가 불러지면 timer라는 페이즈에 있는 큐에 쌓이게 된다. 그리고 이 큐는 First In First Out으로 먼저 들어온 게 먼저 나가게 되어있다.
- 그리고 싱글 스레드이기 때문에 timers 페이즈에 있는 일을 끝내거나 최대 콜백 수가 될 때까지 한 후에 다른 단계로 이동하게 된다. (ex. timers 끝내고 pending callbacks로 이동)
- 만약 poll이라는 단계에서 큐에 콜백함수 A가 쌓여있고 A안에 다른 콜백함수 B가 있다면 A 콜백함수 처리 후 B 콜백함수를 다시 poll Queue에 추가한다. 그런데 Node.js가 poll단계를 다시 보고 Q에 B 콜백함수가 남아있으니 그것도 처리한다. 이렇게 다 처리한 후 다음 단계로 넘어간다.
- 이런 식으로 큐에 많이 쌓이면 Node가 계속 추가되는 작업을 처리하느라 다음 페이즈로 못 넘어갈 것 같지만, 페이즈는 시스템 실행한도가 있기에 어느 정도 한도를 넘으면 다른 페이즈로 넘어간다.
Event Loop 각각의 단계 살펴보기
Timer: 이 단계는 setTimeout() 및 setInterval()에 의해 예약된 콜백을 실행한다.
Pending Callbacks: 이 단계에서는 TCP 오류 유형과 같은 일부 시스템 작업에 대한 콜백을 실행한다.
Idle, Prepare: 내부적으로만 사용된다. 이 단계에서 이벤트 루프는 아무 작업도 수행하지 않는다. 유휴 상태 (컴퓨터 시스템이 사용 가능한 상태이나 실제적인 작업이 없는 시간) 이며 다음 단계로 이동할 준비를 한다.
Poll: 대부분의 I/O 관련 콜백을 실행한다. (close 콜백, 타이머에 의해 예약된 콜백 및 setImmediate()를 제외하고 거의 모두.)
Check: 여기에서 setImmediate() 콜백이 호출된다.
Close Callback: 이 단계에서 이벤트 루프는 socket.on('close', fn) 또는 process.exit()와 같은 종료 이벤트와 관련된 콜백을 실행한다.
이벤트 루프의 각 실행 사이에 Node.js는 비동기 I/O 또는 타이머를 기다리고 있는지 확인하고 없는 경우 완전히 종료한다.
참고
2.3 이벤트 루프
> #### 💡 이벤트 루프는 시스템 커널에서 가능한 작업이 있다면 그 작업을 커널에 이관합니다. 자바스크립트가 단일 쓰레드 기반임에도 불구하고 Node.js가 non-block…
wikidocs.net
'NODE.JS' 카테고리의 다른 글
[Node.js] setImmediate()과 setTimeout(), 그리고 process.NextTick() (0) | 2024.01.12 |
---|---|
[Node.js] Event Loop Phase 더 알아보기 (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 |
[Node.js] Blocking과 Non-Blocking (0) | 2024.01.05 |