티스토리 뷰

Node.js로 multi threading, multi processing을 필요로하는 작업을 진행하게 되었다.

 

Node.js에서 multi threading을 위해서는 worker_thread(node version 10부터 사용가능)를 사용한다. Multi processing을 위해서는 child_process 또는 cluster를 사용한다.

 

process를 단순하게 병렬로 실행하는 것은 child_process로 가능하고, 로드밸런싱과 포트 공유가 필요하다면 cluster를 사용하는 것이 좋다.

multi threading과 multi processing 중 선택

multi threading, multi processing을 사용하여 모두 구현은 가능하지만 두가지의 장단점이 다르기 때문에 요구사항에 따라 선택해야 한다.

multi threading을 사용하는 것은 multi processing을 사용하는 것 보다 병렬처리를 가볍게 처리하는 방식이다. memory를 효율적으로 공유하고 적은 공간을 사용할 수 있다. Multi processing으로 구현하는 경우 메모리를 공유할 수 없고 통신(IPC)을 통해 데이터를 주고 받아야 한다.

 

multi processing은 CPU-intensive한 작업을 처리할 때 선택하는 것이 좋고 multi threading은 I/O-intensive한 작업을 처리할 때 선택하는 것이 좋다.

참고: Exploring the Worker Thread API in Node

worker_thread 사용 예시

const { Worker } = require('worker_threads')

const runService = (workerData) => {
  return new Promise((resolve, reject) => {
    const worker = new Worker(__filename,{ workerData });
    worker.on('message', resolve);
    worker.on('error', reject);
    worker.on('exit', (code) => {
      if (code !== 0)
        reject(new Error(`Worker stopped with exit code ${code}`));
    })
  })
}

const run = async () => {
  const result = await runService('test')
}

run().catch(err => console.error(err))

cluster 사용 예시

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
// main process가 실행
  console.log(`Master ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
// worker process가 실행
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('hello world\n');
  }).listen(8000);

  console.log(`Worker ${process.pid} started`);
}

Javascript 파일을 처음 실행하는 process가 마스터가 된다. 마스터에서는 fork() 메서드를 통해서 새로운 worker를 생성한다.

'develop' 카테고리의 다른 글

3 계층 architecture  (0) 2021.10.29
AWS KMS  (0) 2021.10.17
VPC AWS ElasticSearch Service로 Cognito 인증 접근  (0) 2021.02.05
Airflow 기본 시용법 정리  (0) 2021.01.22
S3 tagging으로 lifecycle 적용하기  (0) 2020.11.11
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함