기본 패턴
javascript
import { MessageChannel, Worker } from "node:worker_threads";설명
worker_threads의 기본 카드는 "CPU 바운드 작업을 분리한다"는 출발점에 가깝고, 실전에서는 그 다음 단계가 더 중요합니다. 바로 "워커를 어떻게 재사용하고 메시지를 어떻게 주고받을 것인가"입니다.- 요청마다 워커를 새로 만들면 생성 비용이 누적되므로, 반복 작업이 많은 경우에는 pool 전략이 훨씬 자연스럽습니다. 즉 worker는 보통 일회용보다 재사용 가능한 실행 슬롯으로 다룹니다.
MessageChannel은 워커와 메인 스레드, 또는 워커끼리 더 구조화된 통신 채널을 만들 때 유용합니다. 단순postMessage()보다 메시지 경계를 더 또렷하게 설계할 수 있습니다.- transfer list와
SharedArrayBuffer는 복사 비용을 줄이거나 메모리를 공유하게 해 주지만, 동시에 동기화와 데이터 무결성 문제를 끌고 옵니다. 즉 성능 도구이면서 설계 도구이기도 합니다. - 그래서 worker 실전 설계의 핵심은 "분리할 것인가"보다 "어떤 단위로 work item을 보내고, 어떤 방식으로 결과를 수집하며, 얼마나 오래 살아 있게 할 것인가"입니다.
빠른 정리
| 개념 | 역할 |
|---|---|
| worker pool | 워커 생성 비용을 줄이고 재사용 |
MessageChannel | 구조화된 메시지 전달 경로 |
| transfer list | 버퍼를 복사 대신 이동 |
SharedArrayBuffer | 메모리 공유 |
| 핵심 판단 | 작업 단위, 통신 방식, 수명주기 설계 |
주의할 점
worker를 늘리는 것만으로 성능이 자동으로 좋아지지는 않습니다. 메시지 직렬화 비용, 생성 비용, 공유 메모리 복잡도까지 함께 고려해야 실제 이득이 납니다.
참고 링크
1 sources