[nodejs] 병렬 컴퓨팅
병렬 컴퓨팅은 여러 개의 작업을 동시에 처리하는 컴퓨팅 방식입니다. Node.js는 단일 쓰레드 이벤트 루프 모델을 가지고 있지만, 클러스터링과 워커 스레드를 이용하여 병렬 처리를 구현할 수 있습니다.
클러스터링
클러스터링은 여러 개의 프로세스를 생성하여 병렬로 작업을 처리하는 방식입니다. Node.js의 cluster
모듈을 사용하여 간단하게 클러스터링을 구현할 수 있습니다. 아래는 클러스터링을 이용한 간단한 예제입니다.
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`마스터 프로세스가 실행 중입니다. ID: ${process.pid}`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`워커가 종료되었습니다. ID: ${worker.process.pid}`);
});
} else {
http.createServer((req, res) => {
res.writeHead(200);
res.end('안녕, 세계!');
}).listen(8000);
console.log(`워커가 실행 중입니다. ID: ${process.pid}`);
}
위 예제는 마스터 프로세스에서 워커 프로세스를 생성하여 HTTP 서버를 구동하는 간단한 클러스터링 코드입니다.
워커 스레드
Node.js Worker Threads API를 사용하여 워커 스레드를 생성하여 병렬 처리를 할 수 있습니다. 아래는 Worker Threads API를 이용한 예제입니다.
const { Worker, isMainThread, parentPort } = require('worker_threads');
if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (message) => {
console.log(message);
});
worker.postMessage('안녕, 워커!');
} else {
parentPort.on('message', (message) => {
console.log(message);
parentPort.postMessage('안녕, 마스터!');
});
}
위 예제는 메인 스레드에서 워커 스레드를 생성하여 메시지를 주고받는 간단한 예제입니다.
Node.js를 이용하여 클러스터링과 워커 스레드를 적절히 활용하면 병렬 처리를 효율적으로 수행할 수 있습니다.
참고 자료
- Node.js 공식 문서: https://nodejs.org/api/cluster.html
- Node.js 공식 문서: https://nodejs.org/api/worker_threads.html