노드는 기본적으로 싱글스레드 and 논블로킹 방식으로 작동되는 것을 알고있다.
하지만 노드에서도 멀티 스레드를 활용하는 방식이 있다.
바로 worker_threads모듈을 활용하면 된다.
간단한 사용 법이다.
const {
Worker, isMainThread, parentPort,
} = require('worker_threads');
// 기존에 동작하던 싱글 스레드를 메인 스레드 또는 부모 스레드라고 부른다
if (isMainThread) { // 부모일 때
// new Worker를 통해 현재파일(__filename)을 워커 스레드에서 실행
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 { // 워커일 때 else부분만 워커스레드에서 실행된다
parentPort.on('message', (value) => {
console.log('from parent', value);
parentPort.postMessage('pong');
parentPort.close();
});
}
먼저 isMainThread를 통해 현재 코드가 메인스레드에서 실행되는지, 아니면 우리가 생성한 워커 스레드에서 실행되는지 구분된다.
워커에서 on 메서드를 사용할 때는 직접 워커를 종료해야한다.
node worker_threads
from parent ping
from worker pong
worker exit
메인 스레드(부모 스레드)에서 new Worker() 를 통해 워커를 생성하고, workerData로 워커에 데이터를 전송한다.
parenPort.postMessage 메서드로 부모 스레드와 워커사이의 통신이 가능하다.
많은 CPU작업을 요구하는 task에는 이 방법이 효율적이다.
반대로 간단한 작업에는 오히려 워커를 만드는 비용이 더 클 수도 있다.
이 방법을 참고하여 많은 CPU를 사용하는 작업에 적용 해 보아야겠다.