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을 더해서 부모쓰레드에게 보낸다