node.js를 찍먹하다가 Non-blocking과 단일 스레드 이벤트 루프를 알게 되었다.
크롬 V8 JS 엔진으로 빌드된 JS 런타임 환경
==
자바스크립트를 브라우저 밖에서 사용할 수 있게 해주는 프로그램
None-blocking / Blocking 과 Synchronous / Asynchronous 개념은
얼핏 비슷해보이지만 관심사가 다름!
Non-Blocking / Blocking
호출되는 함수가 바로 리턴하느냐 마느냐
바로 리턴
바로 리턴X
Synchronous / Asynchronous
호출되는 함수의 작업 완료 여부를 누가 신경쓰느냐
호출하는 함수는 작업 완료 여부를 신경쓰지 않음
호출하는 함수가 호출되는 함수의 작업 완료를 기다림
엥 싱글 스레드인데 어떻게 비동기 작업을 하지요?
~~이벤트 루프
request('http://www.google.com', function(error, response, body) {
console.log(body);
});
console.log('Done!');
request 함수가 호출되면 call stack
에 push,
실행되면서 call stack
에서 pop
request web api 처리가 완료되면, 콜백 함수가 callback queue
에 올라감
console.log('Done!') 이 call stack
에 쌓임
call stack
에 아무것도 없고, callback queue
에 task가 존재한다면
이벤트 루프는 queue
에 있는 task를 꺼내 call stack
에 올려서
콜백 함수를 실행함
call stack
, callback queue
에 아무것도 없다면 프로그램 종료
- 4줄 정리
- v8 엔진이 코드를 읽으면서
call stack
에 넣음call stack
에 쌓인 함수를 실행 (FILO)- 함수를 실행하면서 비동기 처리가 필요한 애덜은 callback queue에 넣음
- 이벤트 루프는
call stack
이 빈 상태가 되면,
callback queue
의 첫번째 콜백을call stack
으로 밀어넣음 (==tick
)
- 2줄 정리
- callstack == 지금 할 수 있는 일 / callback queue == 시간 걸리는 일
- 이벤트 루프가 하는 일
== 지금 할 수 있는 일 다 끝냈으면 시간 걸리는 일 하나씩 꺼내옴
마이크로 태스크 큐, 매크로 태스크 큐