Node.js란?
이 그림 보면 바로 이해된다. 단, 그림에는 나와있지 않지만 libuv는 커널에서 NIO 지원하는 작업이라면 굳이 thread 쓰지 않는다.
- Node.js는 V8 엔진을 사용해 js -> binary로 바꿔주고, 이를 실행하는 “ 런타임 플랫폼 “ 이다. (자바의 JRE 처럼)
node는 싱글스레드 기반의 이벤트루프를 사용한다. - O
- “하지만 libuv에서 worker thread 사용하는데?!”
- 이는 low-level에서 비동기 처리가 불가능한 것을 thread로 wrapping해서 고수준에서는 비동기처럼 보이게끔 하는 것에 가깝다.
- 다른 언어나 플랫폼에서도 nio 지원 안되는 blocking 함수들 thread로 wrapping하는 경우가 있는데, 이와 비슷하다.
- 그림에는 나와있지 않지만 해당 플랫폼에서 비동기 처리가 가능한 작업이라면, (e.g., windows의 IOCP를 쓸 수 있다면) 굳이 worker thread 사용할 필요 없으므로, 이를 사용해서 커널단 까지 nio가 이어지도록 한다.
- 아무튼 이러한 처리는 저수준에서 알아서 해주는거고, 우리가 실제로 js로 개발할 때는 싱글 스레드 기반의 비동기 환경이라고 인지하고 개발해야 하므로 , node는 싱글 스레드 기반의 언어다. 라고 얘기해도 무리가 없어 보인다.
- 이는 low-level에서 비동기 처리가 불가능한 것을 thread로 wrapping해서 고수준에서는 비동기처럼 보이게끔 하는 것에 가깝다.
- 근데 node 10 버전 이상 부터는 고수준에서도 멀티스레드 사용 가능하지 않나?
- 맞다. 노드 10 버전부터는 고수준에서
worker_threads
에 명시적으로 작업을 던져 스레드 기반의 동시처리가 가능하다. - 그 전까지는 CPU bound 작업을 처리하기가 어려웠는데, 이 lib이 나오면서 CPU bound 작업을 스레드에 던질 수 있게 되었다.
- 맞다. 노드 10 버전부터는 고수준에서
참고
This post is licensed under CC BY 4.0 by the author.