기본 패턴
javascript
import { Worker } from "node:worker_threads";
const worker = new Worker(new URL("./worker.js", import.meta.url), {
workerData: { size: 5_000_000 },
});
worker.on("message", (result) => {
console.log("done:", result);
});설명
- Node.js의 일반 비동기 I/O는 네트워크나 파일 대기 시간을 숨기는 데 강하지만, 긴 계산 자체를 빠르게 처리해 주지는 않습니다.
- 이미지 처리, 대량 파싱, 압축, 수학 계산처럼 CPU를 오래 잡아먹는 작업은 이벤트 루프를 막아 서버 전체 응답성을 떨어뜨릴 수 있습니다.
worker_threads는 같은 프로세스 안에서 별도 JavaScript 실행 환경을 열어 이런 CPU 바운드 작업을 분리할 때 적합합니다.child_process와 비교하면 메모리 공유와 통신 비용 면에서 더 가볍게 쓸 수 있지만, 프로세스 완전 격리가 필요한 상황은 아닙니다.- 작업량이 작거나 아주 짧다면 워커 생성 비용이 더 클 수 있으므로, "무조건 워커"가 아니라 병목이 실제로 CPU 계산인지부터 확인하는 편이 좋습니다.
짧은 예제
javascript
// worker.js
import { parentPort, workerData } from "node:worker_threads";
let total = 0;
for (let i = 0; i < workerData.size; i += 1) total += i;
parentPort.postMessage(total);빠른 정리
| 항목 | 의미 |
|---|---|
| 메인 스레드 | 요청 처리, 이벤트 루프 유지 |
| Worker | 긴 계산을 분리 실행 |
workerData | 시작 시 넘기는 입력 |
postMessage() | 결과나 진행 상황 전달 |
주의할 점
worker_threads는 "비동기 I/O 대체"가 아니라 "CPU 계산 분리"에 더 가깝습니다.
병목이 데이터베이스 응답 지연인지, 네트워크 대기인지, 실제 계산량인지 먼저 구분해야 올바른 도구를 고를 수 있습니다.
참고 링크
1 sources