
이벤트 기반이란, 이벤트 발생 시 미리 지정해둔 작업을 수행하는 방식을 의미함
이벤트 리스너에 콜백(callback) 함수를 등록한다.
발생한 이벤트가 없거나, 발생했던 이벤트의 처리가 종료되면 노드는 다음 이벤트 발생까지 대기
노드는 자바스크립트 코드의 맨 위부터 한 줄씩 실행
function first() {
second();
console.log('1st');
}
function second() {
third();
console.log('2nd');
}
function third() {
console.log('3rd');
}
first();
호출 스택을 생각해 보았을 때,
콘솔의 출력 결과는 다음과 같을 것이다.
**Console**
3rd
2nd
1st
기본적으로 자바스크립트 코드는 동시에 실행될 수 없음.
그러나, 자바스크립트상에서 돌아가는 것이 아닌 I/O(input/output) 작업은 동시 처리 가능
노드는 이러한 I/O 작업에 한하여 논 블로킹 방식으로 처리
노드는 I/O 작업에 대하여 백그라운드로 넘긴 뒤 동시에 처리
=> 즉, 동시에 처리 가능한 작업들은 최대한 묶어서 백그라운드로 넘기는 것이 좋다
function longRunningTask(){
//오래 걸리는 작업
console.log('작업 끝');
}
console.log('시작')
longRunningTask();
console.log('다음 작업');
실행 결과는 당연하게도
시작
작업 끝
다음 작업
setTimeout을 사용하여 코드를 작성하면,
function longRunningTask() {
//오래 걸리는 작업
console.log('작업 끝');
}
console.log('시작');
setTimeout(longRunningTask, 0);
console.log('다음 작업');
이때의 실행 결과는 다음과 같다.
시작
다음 작업
작업 끝
setTimeout(callback, 0)은 코드를 논 블로킹으로 만들기 위하여 사용된다.
callback 함수는 태스크 큐로 보내지므로 순서대로 실행되지 않는다.
다음 작업이 먼저 실행된 후, 오래 걸리는 작업이 완료되는 프로세스이다.
노드 실행 > 프로세스 생성 > 프로세스 내에 스레드 여러개 생성
이때, 내가 직접 제어할 수 있는 스레드는 1개
--> 노드를 싱글 스레드라고 표현하는 이유