[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를 이용하여 클러스터링과 워커 스레드를 적절히 활용하면 병렬 처리를 효율적으로 수행할 수 있습니다.

참고 자료