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를 종료한다.