31. worker threads

노드에서 멀티 스레드 방식으로 작업을 할 수 있게 지원해주는 모듈이다.

  • isMainThread: 현재 코드가 메인 스레드에서 실행되는지, 워커 스레드에서 실행되는지 구분하는 메서드이다.
  • 메인 스레드에서는 new Worker를 통해 현재 파일(__filename)을 워커 스레드에서 실행시킨다.
  • worker.postMessage로 부모에서 워커로 데이터를 보낸다.
  • parentPort.on('message')로 부모로부터 데이터를 받고, postMessage로 데이터를 보낸다.

노드에서 멀티 스레드를 하는 경우는 극히 드물다.
CPU를 많이 잡아먹는 암호화나 압축할 때 그럴때나 써야되고, 대부분의 경우는 싱글스레드라고 생각하면된다.
노드에서 멀티스레드가 메인이되는 일은 거의 없을 것이다.

const {Worker, isMainThread, parentPort} = require('worker_threads')

if (isMainThread) { // 메인 스레드일 때, (부모일 때)
    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 { // 워커 스레드일 때
    parentPort.on('message', value => {
        console.log('from parent', value);
        parentPort.postMessage('pong');
        parentPort.close(); // 워커 스레드가 할일을 다 했을 때, 종료
    })
}

// from parent ping
// from worker pong
// worker exit