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 |