PracticeEveryday

Nodejs 본문

Nodejs

Nodejs

kimddakki 2022. 5. 14. 14:11
이벤트 루프

Node 실행과 이벤트 루프 흐름

실제로 node someScript.js를 실행했을 때 어떤 일이 일어나는지 보자

우리가 node someScript.js를 실행하면 Node.js는 우선 이벤트 루프를 만든다.

그리고 이벤트 루프 바깥에서 someScript.js를 실행한다.

처음부터 끝까지 someScript를 실행하고 나면 Node.js는 그제서야 이벤트 루프를 확인한다.

이벤트 루프에 남은 작업이 있다면 Node.js는 이벤트 루프에 진입해 반복하며 작업을 실행한다.

이벤트 루프에 남은 작업이 없다면 Node.js는 process.on('exit', callback)을 실행하고 이벤트 루프를 종료한다.

 

// case 1

// test.js
console.log("Hello World");

1. node test.js를 실행하면 Node.js는 우선 이벤트 루프를 생성한다.

2. 생성한 이벤트 루프에 진입하지 않고 이벤트 루프 바깥에서 test.js를 처음부터 차례대로 실행한다.

 => Timer Phase에 진입하기 전에 test.js를 처음부터 끝까지 실행한다.

 => Hello World라는 문자열이 출력된다!!

3. test.js를 처음부터 끝까지 실행했으므로 이벤트 루프가 살아있는지 확인한다.

 => 이벤트 루프에 남은 작업이 있는 지 확인한다.

 => 그 어떤 비동기 호출 작업도 없기 때문에 이벤트 루프에는 남은 작업이 없다.

4. process.on('exit') 콜백을 실행하고 이벤트 루프를 종료한 뒤에 프로그램을 종료한다.

// case 2

// test.js
setTimeout(() => console.log("Async Hello World"), 1000);
console.log("Hello World");

1. node test.js를 실행하면 Node.js는 우선 이벤트 루프를 생성한다.

2. 생성한 이벤트 루프에 진입하지 않고 이벤트 루프 바깥에서 test.js를 처음부터 끝까지 실행한다.

 => 이벤트 루프를 만들어 놓고 Timer Phase에 진입하기 전에 test.js를 끝까지 실행한다.

 => setTimeout이 호출 되며 Timer Phase에 Async Hello World라는 문자열을 1초 뒤에 출력하는 콜백을 Timer Phse에 등록한다.

 => Hello World라는 문자열을 출력한다.

3. test.js를 처음부터 끝까지 실행했으므로 이벤트 루프가 살아있는지 확인한다.

 => 이벤트 루프에 작업이 남아있는지 확인한다.

 => case 2의 경우 setTimepout으로 Timer Phase에 등록한 작업이 있으므로 이벤트 루프에 진입한다.

4. 이벤트 루프의 Timer Phase에 진입한다. Node.js는 Timer Phase 가 관리하는 타이머들을 살펴보면서 실행할 준비가 되어 있는지 확인한다.

 => 1초위에 Async Hello World 라는 문자열을 출력하기로 했으므로 실행할 준비가 안 되었다 가정하자

 => 실행할 수 있는 작업이 없으므로 Node.js는 다음 페이즈로 이동한다.

5. Node.js는 Timer Phase를 지내 Pending Callbacks => ... 를 차례대로 방문한다. 각 페이즈에 실행할 작없이 없으므로 Node.js는 Loop Alive 까지 아무런 작업 없이 도달한다.

6. 다시 한번 이벤트 루프가 살았는지 확인한다. 

 => 1초가 지나지 않아 실행할 수 있는 작업은 없지만 아직 실행하지 못한 작업이 있으므로 이벤트 루프는 살아 있다.

 => 다시 Timer Phase로 진입한다.

7. Node.js가 이벤트 루프를 열심히 돌다가 1초가 지나 이전에 setTimeout으로 등록해뒀던 콜백이 이제 실행할 준비가 되었다.

 => Node.js는 Timer Phase가 관리하는 큐에서 콜백을 꺼내 실행한다.

 => Async Hello World가 출력 된다. Timer Phase에는 더 이상 남아있는 작업이 없으므로 다음 페이즈로 이동한다.

더보기

실제로 위와 같은 상황에서 Node.js는 1초가 지날 때까지 이벤트 루프를 무한 반복 하지 않는다. 실제로는 Poll Phase에서 이벤트 루프를 반복해도 실행할 수 있는 작업이 없는 것을 인지하고 1초가 지나 setTimeout 콜백을 실행할 수 있을 때까지 대기한다. 1초가 지나 타이머의 콜백을 실행할 수 있게 되면 그제서야 다음 페이즈로 이동한다. 자세한 내용은 Poll Phase에서 살펴보자

8. Node.js는 이벤트 루프의 페이즈들을 하나하나 방문한다. 물론 실행할 작업이 없기에 큐를 확인하고 바로 다음 페이즈로 넘어간다.

 => Loop Alive에 도달하면 이벤트 루프가 살아있는지 확인하고 실행할 작업이 없으므로 process.on('exit')의 콜백을 실행한다.

 => 이벤트 루프를 종료한 뒤에  프로그램을 종료한다.

 

Node.js가 우선 이벤트 루프를 만들고 이벤트 루프 바깥에서 코드를 실행한다는 의미를 이해할 수 있다.

1. Node.js는 코드를 실행하기 전에 이벤트 루프를 생성한다.
2. Node.js는 이벤트 루프 바깥에서 코드를 처음부터 끝까지 실행한다.
3. 이벤트 루프가 살아있는지 확인하고 진입하거나 Exit Callbacks를 실행하고 프로그램을 종료한다.
4. 이벤트 루프에 진입하면 페이즈를 차례대로 돌면서 실행할 수 있는 작업을 실행한다.
5. 매 반복마다 이벤트 루프가 살아 있는지 확인하고 죽었다면 Exit Callbacks를 실행하고 프로그램을 종료한다.

 

 

Node.js 이벤트 루프(Event Loop) 샅샅이 분석하기

글에 들어가기에 앞서 Node.js의 이벤트 루프의 경우 공식 문서에 설명이 부족하고 이에 따라 여러 사람들이 각자 나름대로 분석한 글이 많아 무엇이 이벤트 루프의 정확한 동작인지 알기 힘듭니

www.korecmblog.com

 

'Nodejs' 카테고리의 다른 글

Nodejs  (0) 2022.05.14
Nodejs  (0) 2022.05.14
Nodejs  (0) 2022.05.14
Nodejs  (0) 2022.05.14
Nodejs  (0) 2022.05.13
Comments