33. worker threads 3
Node.js에서 Worker 스레드는 기본적으로 메인 스레드와 별도로 동작한다.
Worker 스레드의 코드가 모두 실행되고 나면, 그 스레드는 자동으로 종료된다.
따라서 .close()
메서드를 호출하지 않아도, Worker 스레드의 코드가 모두 실행되면 exit
이벤트가 발생하게된다.
const {Worker, isMainThread, parentPort, workerData} = require('worker_threads')
if (isMainThread) { // 메인 스레드일 때, (부모일 때)
const threads = new Set(); // 중복되지 않는 배열
// new Worker의 2번재 인자: 초기 데이터
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', () => {
console.log('threads.size', threads.size)
threads.delete(worker);
if (threads.size === 0) {
console.log('worker exit');
}
});
/**
*
* */
// worker.postMessage('ping');
/**
*
* */
}
} else { // 워커 스레드일 때
/**
*
* */
// Worker 생성시 초기데이터를 아래와 같은 방식으로 가져온다.
// const data = workerData;
// parentPort.postMessage(data.start + 100);
/**
*
* */
}
// from worker 101
// from worker 102
// worker exit
주어진 코드에서 워커 스레드의 코드는 주석 처리되어있어서 실제로는 아무것도 실행하지 않는다.
그러나 코드가 없어도 스레드는 시작되었다가 바로 종료되므로 exit
이벤트가 발생하게된다.
그 결과 메인 스레드에서 exit
이벤트에 등록한 콜백 함수가 실행되게 된다.