개발자가 되고 싶은 개발자

Node.js는 싱글 스레드인가? 본문

Dev/Node.js

Node.js는 싱글 스레드인가?

Fullth 2024. 5. 11. 18:12

 

개요

 

약 2시간이 소요되는 작업이 있었고, Chunk 방식로 Connection pool의 갯수만큼 나눠서 처리하는 작업이다.

본문의 제목과 같이 Node.js 환경에서 동작하고 있고, 성능 개선을 시도하려고 한다.

 

PM2와 같은 프로세스 매니저를 이용해서 프로세스 자체를 여러 개 띄워서 해결할 수도 있지만, 문득 원론적으로 Node.js가 싱글/멀티 스레드인지 헷갈려서 해당 개념을 정리하고자 WorkerThreads와 같이 조사한다.

 

node/lib/worker_threads.js at v20.12.1 · nodejs/node

Node.js JavaScript runtime ✨🐢🚀✨. Contribute to nodejs/node development by creating an account on GitHub.

github.com

 

JavaScript

우선, 자바스크립트는 단일 스레드 언어이다.

 

JavaScript | MDN

JavaScript (JS)는 가벼운, 인터프리터 혹은 just-in-time 컴파일 프로그래밍 언어로, 일급 함수를 지원합니다. 웹 페이지를 위한 스크립트 언어로 잘 알려져 있지만, Node.js, Apache CouchDB, Adobe Acrobat처럼

developer.mozilla.org

 

Node.js

그리고, 노드는 단일 스레드 언어인 자바스크립트의 런타임 환경이다.

그래서 Node.js도 단일 스레드 기반인 것인가? Worker threads로 어떻게 병렬 처리들을 할 수 있다는걸까?

Node.js의 이벤트 루프 기반의 비동기 방식처럼 단지 병렬처리 되는 것 같은 효과를 내는 것일까? (Non-Blocking I/O)

 

아래와 같이 공식문서에서는 Worker Threads를 이용해서 병렬처리를 가능하다고 설명한다.

The node:worker_threads module enables the use of threads that execute JavaScript in parallel. To access it:
const worker = require('node:worker_threads'); 

 

 

Node.js — Don't Block the Event Loop (or the Worker Pool)

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

위 글의 Summary에서는 Node.js는 몇 개의 스레드밖에 없기 때문에 현명하게 사용하려면 어플리케이션을 구조화해야 한다는 문장이 있다. 완벽하게 근거가 되진 않지만 Node.js 자체가 단일 스레드인 것은 아닌 것처럼 보인다.

But because Node.js has only a few threads, you must structure your application to use them wisely.

 

Single Process

 

 

Node.js — Introduction to Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

Node.js 앱은 모든 요청에 대해 새 스레드를 만들지 않고, 단일 프로세스에서 실행된다.
Node.js는 표준 라이브러리에 비동기 I/O 세트를 제공하여 JavaScript 코드가 차단되는 것을 방지한다.

기본적으로 Node.js는 하나의 메인 프로세스에서 모든 동작을 처리한다.

Event Loop

 

 

Node.js — The Node.js Event Loop

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

자바스크립트가 싱글 스레드임에도 불구하고, I/O 작업에서 성능적 이점을 갖을 수 있는 이유는 이벤트루프가 명령마다 시스템커널로 작업을 오프로딩해주기 때문이다.

 

이처럼 일반적으로 I/O의 강점이 필요한 작업을 처리할 때 채택하는 환경이 Node.js이고, 기본적으로 단일 스레드 기반이기 때문에 대체로 해당 개념을 기반으로 설명이 되곤해서 오해가 생기는 부분들이 있는 것으로 생각된다.

정리

  • 싱글스레드 언어인 자바스크립트의 런타임이기 때문에 기본적으로 싱글스레드로 동작한다.
  • Workder_Treads와 같이, 멀티 스레드로 처리할 수 있는 방법이 존재한다.

TODO

각 기본적인 개념 다시 한 번 정리

정리한 것 기반으로 해당 포스팅 내용 보완

 

 

 

Node.js is Not Single-Threaded

Node.js is known as a blazingly fast server platform with its revolutionary single-thread architecture, utilizing server resources more…

medium.com

 

 

'Dev > Node.js' 카테고리의 다른 글

Express + TypeScript Boilerplate  (0) 2023.03.28
[Node.js] Node.js 프로파일링  (0) 2023.03.13