Node.js 특징
- Single-Thread의 non-blocking I/O 이벤트 기반 비동기 방식으로 작동한다.
하지만 Main-thread만 single일 뿐, 실제 작업은 worker threads pool에 있는 스레드들이 작업한다.
흔히 말하는 event loop가 main thread의 별칭이다 (반대로 libuv는 worker threads pool을 의미한다.). 이 event loop는 non blocking 방식으로 일을 처리하기 때문에 빠른 IO 성능을 가진다.
즉 , Event loop이란, Node.js의 메인 스레드로서, 싱글 스레드로 구성되지만 블로킹 될만한 것을 논블로킹 되게 만들어(worker thread로 작업을 넘겨줘서) node.js가 자원대비 효울적으로 충분히 빠르게 동작하도록 한다.
(참고 : 이벤트 루프(Event Loop)란? (tistory.com))
이벤트 루프는 다음과 같이 구성된다.
timers : setTimeout(), setInterval() 등으로 스케줄 된 callback 수행.
pending callbacks : 다음 loop로 미뤄진 IO callback 수행
idle, prepare : 내부적으로 사용 (poll이나 timers 등에 작업이 없을 경우?)
poll : 새로운 IO 이벤트를 가져와서 IO와 관련된 callback을 수행
check : setImmediate()에 의해 스케줄된 callback 수행. 그래서, setImmediate()로 callback을 지정했다면, poll이 끝나자마자 바로 수행할 수 있다. 그렇지 않은 경우네는 pending callback으로 넘어간다.
close callbacks : socket.on('close', ...) 와 같이 close와 관련된 callback이 수행된다.
만약 어떤 함수에서 일반적인 callback을 실행했다면, 그 callback 함수는 pending callbacks로 가서 다음 event loop의 pending callbacks phase에서 처리될 것이다.
그런데 그것보다 더 빨리 처리되기 원한다면 (setTimeout이나 setInvterval로 지정된 함수보다 더빨리 원한다면), setImmediate()로 처리할 수 있을 것이다.
여기서 더 욕심을 부려서 setImmediate()보다 빨리 실행되기 원한다면 process.nextTick()으로 현재 poll phase queue에 넣어서 현재 phase에서 바로 실행할 수 있다.
멋지다..
참고
nodejs의 내부 동작 원리 (libuv, 이벤트루프, 워커쓰레드, 비동기) (tistory.com)
setImmediate(), setTimeout() 그리고 process.nextTick() (tistory.com)
'프로그래밍 공부 > CS 공부' 카테고리의 다른 글
디자인 패턴 (작업중...) (0) | 2021.04.28 |
---|---|
객체 지향 프로그래밍이란 (0) | 2021.04.27 |
HTTPS (대칭키와 비대칭키) (0) | 2021.04.22 |
댓글