아직까지는 워커 스레드를 사용해 복잡한 작업은 하지 않았습니다. 이번에는 여러 개의 워커 스레드에 데이터를 넘겨봅시다. postMessage로 데이터를 보내는 방법과는 다른 방법입니다.

    ▲ 그림 3-10 메인 스레드와 워커의 통신

    worker_data.js

    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);
    }

    new Worker를 호출할 때 두 번째 인수의 workerData 속성으로 원하는 데이터를 보낼 수 있습니다. 워커에서는 workerData로 부모로부터 데이터를 받습니다. 현재 두 개의 워커가 돌아가고 있으며, 각각 부모로부터 숫자를 받아서 100을 더해 돌려줍니다. 돌려주는 순간 워커가 종료되어 worker.on('exit')이 실행됩니다. 워커 두 개가 모두 종료되면 job done이 로깅됩니다.

    콘솔

    $ node worker_data
    from worker 101
    from worker 102
    job done
    신간 소식 구독하기
    뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.