위 그림의 구조는 싱글 스레드에서 이루어진다. 그런데 하나의 콜 스택에서 명령문이 순차적으로 실행된다 것은 지연(pending)을 일으키는 명령문이 있는 경우 프로그램 전체를 멈추게 한다는 의미이다. 그래서 자바스크립트는 지연을 일으키는 명령문들이 Web APIs에서 처리되도록 한다. 그때 명령문이 모두 처리된 후에 호출 될 함수를 하나 함께 넘기는 데 이를 콜백 함수(callback Function)라고 한다. Web APIs에서 처리된 명령문의 콜백 함수는 Callback Queue로 넘겨져 순서를 기다린다. 이때 이벤트 루프(Event Loop)는 실시간으로 두가지 일을 하는데, 하나는 콜 스택이 비워져있는 지 확인하는 것이고 다른 하나는 콜백 큐에 콜백이 있는 지이다. 이벤트 루프는 콜 스택이 비워져 있고 콜백 큐에 콜백이 있으면 그 콜백을 콜 스택으로 옮겨 실행되도록 한다.
하나의 스레드에 하나의 콜 스택에서 지연이 걸리는 작업이 프로그램 전체를 멈추게 하지 않도록 지연이 걸리는 작업을 Web APIs에서 처리하고 이벤트 루프라는 일종의 옵저버로 실행 순서를 제어한다.
Nodejs란 Javascript를 브라우저 밖에서도 실행할 수 있도록 하는 Javascript의 런타임 입니다.
이 Nodejs의 특징으로 Non-blocking I/O, 싱글 쓰레드,이벤트 처리 기반 입니다.
Node.js 구조
자바스크립트 의 콜 스택에 쌓인 이벤트 중 비동기 처리가 필요하게 된경우 libuv 라이브러리를 통해 처리 하게 됩니다.
여러 이벤트(작업) 발생 시 순차적으로 Event Queue 에 쌓이게 됩니다.
이벤트 루프가 순차적으로 백그라운드 혹은 Worker Thread로 이벤트를 넘겨주어 백그라운드 혹은 Worker Thread에서 실제 작업을 진행하게 됩니다. (이벤트 루프는 여러 개의 페이즈(Phase)를 가지며, 각 페이즈는 각자만의 큐를 가지고 있습니다. 또한 Worker Thread default로 4개를 가지기에 멀티 쓰레드 처럼 여러 작업을 비동기적으로 수행가능합니다.)
여러 Phase의 이벤트 루프
Node.js 의 기반이 되는 자바스크립트가 싱글 쓰레드 이기에 Node.js도 싱글 쓰레드라 칭합니다.
하지만 libuv 라이브러리 의 이벤트 루프를 활용하여 여러 작업을 비동기적으로 처리하기에 멀티 쓰레드처럼 이벤트(혹은 작업)를 처리합니다.
Javascript 와 nodejs 간의 싱글 쓰레드 비교
https://gyofeel.github.io/js/nodejs/web/Javascript%EC%99%80-Nodejs%EB%8A%94-%EB%AA%A8%EB%91%90-%EC%8B%B1%EA%B8%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%EB%90%98%EB%8A%94%EA%B0%80/
흔히 말하는 로직이 틀렸다고 말함.
https://sjh836.tistory.com/149
영상 포함
https://so0choi.github.io/2020/09/15/Nodejs/Node-js13/
잘못된 개념 & 상식
https://tk-one.github.io/2019/02/07/nodejs-event-loop/