[node js] worker threads

seokki kwon·2022년 10월 10일
0

worker thread 는 node 의 내장모듈
헷갈려서 정리하려고 한다.

const {
  Worker,
  isMainThread,
  preantPort,
  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();
  });
}

isMainThread:메인쓰레드를 사용할때 코드가 실행되도록 if를 걸어줬다
Worker 생성자로 worker 를 생성한다(독립적인 자바스크립트 실행 스레드)
worker(__filename) 현재 파일을 worker에서 실행시킨다

우선 프로세스를 하나하나 살펴보자

const worker = new Worker(__filename); 

현재 파일 실행을 worker 에게 위임함으로서 바로 eles 문으로 넘어간다

else {
  // 워커일때
  console.log("is Not Main");
  parentPort.on("message", (value) => {
    console.log("from parent", value);
    parentPort.postMessage("pong");
    parentPort.close();
  });
}

ParentPort에게 message 의 내용을 받고 value를 콘솔에 출력한다
그후 parentPort 에게 pong 이라는 메세지를 보낸다
parentPort.close() 를 이용하여 부모와의 연결을 종료시킨다.

const {
  Worker,
  isMainThread,
  parentPort,
  workerData,
} = require("worker_threads");

if (isMainThread) {
  const thread = new Set();
  thread.add(
    new Worker(__filename, {
      workerData: { start: 1 }, // workerData 속성으로 worker에게 데이터 보냄
    })
  );
  thread.add(
    new Worker(__filename, {
      workerData: { start: 2 }, // workerData 속성으로 worker에게 데이터 보냄
    })
  );

  for (let worker of thread) {
    console.log(worker);
    worker.on("message", (message) => console.log("from worker", message));
    worker.on("exit", () => {
      thread.delete(worker);
      if (thread.size === 0) {
        console.log("job done");
      }
    });
  }
} else {
  
  const data = workerData; // 부모로부터 데이터  받기
  parentPort.postMessage(data.start + 100);
}

thread에 worker를 담는다 __filename, 뒤에 오는 인자는 worker에서 받을 수 있다
thread 에서 for 루프가 돌면서 worker.on('message') 메세지를 받는다
아래에서는 workek의 데이터에 100을 더해서 부모쓰레드에게 보낸다

profile
웹 & 앱개발 기록

0개의 댓글