Node.js_워커스레드(worker thread)

Node.js 2021. 7. 1. 15:48

(본 포스팅은 길벗의 'Node.js 교과서' 책을 공부하면서 작성되었습니다_내돈내산) 

 

  • worker_thread: 노드에서 멀티 스레드 방식으로 작업할 수 있게 도와줌. 노드에서 멀티스레드로 사용되는 경우는 극히 드물며, 암호화나 압축과같이 CPU 사용량이 높아지는 경우에만 사용하도록 함.
    - isMainThread: 현재 코드가 메인 스레드에서 실행되는지, 워커스레드에서 실행되는지 구분
    - 메인 스레드에서는 new Worker를 통해 현재 파일을 워커스레드에서 실행시킴
    - worker.postMessage로 부모에서 워커로 데이터를 보냄.
    - parentPort.on('message')로 부모로부터 데이터를 받고, postMessage로 데이터를 보냄.
const {
  Worker, isMainThread, parentPort,
} = require('worker_threads');

if (isMainThread) { // 부모일 때
  const worker = new Worker(__filename); // 파일의 경로 지정
  worker.on('message', message => console.log('from worker', message));
  worker.on('exit', () => console.log('worker exit'));
  worker.postMessage('ping');
} else { // 워커일 때
  parentPort.on('message', (value) => {
    console.log('from parent', value);
    parentPort.postMessage('pong');
    parentPort.close();
  });
}
  •  처음에는 메인스레드가 생성되고 메인스레드쪽에서 워커스레드로 일을 분배해주는 형태가 됨.
  • new Worker 를 호출하는 횟수만큼 워커스레드가 생성됨
const {
  Worker, isMainThread, parentPort, workerData,
} = require('worker_threads');

if (isMainThread) { // 부모일 때
  const threads = new Set();
  threads.add(new Worker(__filename, { // 첫 번째 워커스레드 생성
    workerData: { start: 1 },
  }));
  threads.add(new Worker(__filename, { // 두 번째 워커스레드 생성
    workerData: { start: 2 },
  }));
  for (let worker of threads) {
    worker.on('message', message => console.log('from worker', message));
    worker.on('exit', () => {
      threads.delete(worker);
      if (threads.size === 0) {
        console.log('job done');
      }
    });
  }
} else { // 워커일 때
  const data = workerData;
  parentPort.postMessage(data.start + 100);
}
  • Node.js는 기본적으로 싱글스레드를 기반으로 생성되었기 때문에, 워커스레드를 이용한 멀티스레드 방식을 사용할 경우 개발자가 수동으로 관련 로직을 전부 처리해 주어야함.
  • 워커스레드의 갯수에 따라 비례적으로 처리 시간이 줄어들지 않음. 하드웨어의 성능이나 데이터트랜스퍼를 고려해 최적화 작업을 진행해주어야 함.
  • 노드로는 멀티스레드 작업은 비추천!!

'Node.js' 카테고리의 다른 글

Node.js_HTTP 모듈로 서버 만들기  (0) 2021.07.01
Node.js_버퍼(buffer)와 스트림(stream)  (0) 2021.07.01
Node.js_파일 시스템(fs)  (0) 2021.07.01
Node.js_crypto와 util  (0) 2021.07.01
Node.js_모듈 만들기  (0) 2021.07.01
admin