Node.js처럼 싱글 스레드로 요청을 처리하는 서버가 있다면, 한 번에 하나를 처리하는 서버에 0.1초가 걸리는 요청이 100개가 들어온다면 마지막에 요청한 사람은 10초를 기다려야만 응답을 받을 수 있다.
멀티 스레드를 지원하는 언어라면 스레드를 100개 만들어서 동시에 처리할 수 있지만 싱글 스레드인 자바스크립트는 싱글 스레드이기 때문에 불가능하다.
그럼 어떻게 동시에 처리를 할 수 있을까??
방법은 이벤트 기반 아키텍처를 사용하는 것이다.
콜 스택에 쌓인 작업을 다른 곳에서 처리한 다음 처리가 완료되엇을 대 알림을 받으면 스레드가 하나라도 빠르게 처리할 수 있다.
예를 들면 커피숍 카운터에서 주문을 완료하면 주문은 제조를 하는 직원에게 건네진다.
카운터는 커피가 나올 때까지 기다리지 않고 다음 고객의 주문을 받는다.
진동 벨을 받은 고객은 진동 벨이 울릴 때까지 대기했다가 울리면 주문 음료를 받아가는 것이다.
이때 줄을 섰던 순서와 다르게 빠르게 제조된 음료가 먼저 나올 수 있다.
이런 원리가 이벤트 기반 아키텍처이다.
console.log("1");
setTimeout(()=>console.log(2),1000);
console.log("3");
결과
1
3
(1초 후)
2
흐름은
console.log("1")이 콜 스택에 쌓인 후 바로 1을 출력하며 빠져나가고
setTimeout(()=>console.log("2"),1000)이 콜 스택에 쌓인다.
setTimeout(()=>console.log("2"),1000)은 Node.js의 API로 실행되고
지정된 시간 만큼 대기한다.
대기하는 동안 console.log("3")이 실행되어 콜 스택에 쌓이고 3을 출력하면서 빠져나간다.
1초 후 setTimeout(()=>console.log("2"),1000)는 이벤트 루프의 태스크 큐에 추가되고 이벤트 루프의 각 단계를 진행하며 콜 스택에 나중에 다시 추가된다.
콜백함수를 실행하면서 콜 스택을 빠져나간다.