32. worker threads 2
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
// -----------------------------
// parentPort 가 message 이벤트 헨들러가 등록되어있지않고,
// worker thread의 할 일이 끝났거나 할 일이 없을 때,
// worker thread를 자동으로 .close() 처리해주는듯? 가비지 컬렉터처럼 자동으로 없애주는걸까..?
// message 이벤트가 등록되어있다면 parentPort.close()하지 않는이상 exit 이벤트가 감지되지 않는데..
// 위에는 워커 스레드일 때 실행되는 부분을 주석처리를 해도, 주석 처리를 풀어도 exit 이벤트가 감지되어 worker thread를 종료한다.