Worker Threads - 개념

연도·2025년 6월 13일

JavaScript, TypeScript

목록 보기
8/8
post-thumbnail

참고한 인사이트 : https://velog.io/@surim014/worker-threads-multitasking-in-nodejs, https://inpa.tistory.com/entry/NODE-📚-workerthreads-모듈

워커 쓰레드를 이해하기 이전에 짧게 node.js의 기본인 싱글 스레드 살펴보기

https://velog.io/@kim2004on/Node.js-개념-dbkjh1c5 여기에 기존 node.js 개념은 올렸습니다.

그래서 짧게 정리하면 단일 스레드이고, 이벤트 루프에는 한 번에 하나의 프로세스만 발생함. 즉 하나의 프로세스, 하나의 스레드, 하나의이벤트 루프

이벤트 루프 때문에 단일 스레드 이지만, 비동기로써 여러가지 작업을 돌릴 수 있습니다. 실제로 병렬 처리가 되는 것이 아닌 비동기로 이루어지기 때문이죠.

가장 큰 단점인 복잡한 cpu 자원을 많이 사용하는 로직이 있다면 이 로직으로 인해 다른 프로세스가 에러가 뜰 수 있습니다. 즉 cpu 집약적인 작업이 있다면 과부화로 인해 node의 싱글 스레드가 치명적인 단점으로 작용될 것입니다.

Worker Threads 정의

하나의 프로세스, 여러 개의 스레드, 스레드 별 하나의 이벤트 루프, 스레드 별 하나의 js 엔진 인스턴스, 스레드 별 하나의 node.js 인스턴스

워커 스레드가 필요한 이유

서버는 CPU 집약적인 워크로드로 인해 빠르게 과부화 걸릴 수 있다.

예를 들어서, 두 개의 엔드포인트가 있다고 가정. 하나는 단순하게 CPU를 많이 사용하지 않은 비집약적인 작업을 수행하는 반면 다른 하나는 완료하는 데 10초 이상 걸리는 복잡한 CPU 집약적인 작업을 처리한다.

만약에 서버가? CPU 사용량이 많은 요청을 처리하느라 바쁜 상황이라면..! CPU를 많이 사용하지 않은 요청에는 응답이 느려질 수 있다. 이러한 문제는 Node.js의 황금률, 즉 이벤트 루프를 차단하지 않는다는 원칙 위반.

보통 Node.js는 싱글 스레드 아키텍처를 기반으로 하기 때문에 CPU 집약적인 작업에 적합하지 않은 것으로 알려져 있다.

하지만? 그렇다고 해서 CPU 집약적인 작업을 처리를 해야 하거나, 멀티 스레드의 이점을 활용해야만 할 때!

워커 쓰레드를 이해하기 위한 개념은 동시성 VS 병렬성

동시성 : 싱글 코어에서 한 번에 여러 작업을 처리하는 것.

병렬성 : 멀티 코어에서 한번에 여러 작업을 수행하는 것.

싱글 스레드에서 여러 작업을 수행(동시성)하는 것은, 동시에 실행(병렬성)하는 것보다 시간이 더 오래 걸림.

동시성의 활용은

  • 주로 I/O 작업에 유리 (ex. 네트워크, DB, 파일 등)
  • 이런 작업은 CPU보다 대기 시간이 많음 → 그동안 다른 작업 처리 가능

Node.js에서의 구조는 싱글 스레드 기반 + 논블로킹 I/O

  • I/O 작업은 백그라운드 스레드가 처리 → 끝나면 콜백을 이벤트 루프가 실행
  • 콜백 실행은 메인 스레드에서 일어난다

CPU를 많이 쓰는 작업은 워커 스레드로 분리해야 함, 그렇지 않으면 메인 스레드가 막혀 전체 앱이 느려질 수 있음

프로세스, 스레드 이해

프로세스

  • 실행 중인 독립된 프로그램
  • 자체 메모리 공간 사용 → 다른 프로세스 메모리에 접근 불가
  • 하나의 작업만 실행 (단일 흐름)
  • 멀티코어 환경에선 여러 프로세스가 병렬 실행 가능

스레드

  • 프로세스 내부의 작업 단위
  • 메모리 공유 (같은 프로세스 내에서)
  • 가볍고, 생성 비용이 낮음
  • 하나의 프로세스 내에서 여러 스레드가 동시 실행 가능

비유

워커쓰레드 동작 과정

워커 스레드 동작 흐름

초기화 단계

  • 워커 인스턴스를 생성하고, 부모와 워커가 처음으로 연결됨. 이때 부모가 워커에게 말

이 스크립트(worker.js)를 이 데이터랑({ num: 5 }) 같이 실행해줘. 이걸 "초기화 메타데이터"라고 한다

실행 단계

  • 워커가 새롭게 V8, 이벤트 루프(libuv)를 세팅하고, 전달받은 초기화 정보로 worker.js를 실행함

워커 스레드 한계

워커 스레드의 구조적 한계

  • 독립된 환경 : 워커마다 별도 V8, libuv, 이벤트 루프, 힙 → 일반적인 멀티스레드와 다르다
  • 공유 메모리 기반 아님 → 비용 크고 상호작용 어렵다

비효율적 사용 예

  • I/O 작업엔 부적절 → Node의 비동기 I/O가 훨씬 효율적
  • 단순한 병렬 처리에는 오버헤드 크다

주의사항

  • 디버깅 어려움 → AsyncResource로 추적 강화 가능
  • 코어 수보다 많은 워커 생성 금지 → 컨텍스트 스위칭 오버헤드 발생
profile
Software Engineer

0개의 댓글