• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

parentPort.close() 질문입니다

21.09.27 14:48 작성 조회수 222

0

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

if (isMainThread) {
const worker = new Worker(__filename);
worker.on('message', (value) => console.log('워커로부터', value));
worker.on('exit', () => console.log('워커 끝'));
worker.postMessage('ping');
}else {
parentPort.on('message', (value) => {
console.log('부모로부터', value);
parentPort.postMessage('pong');
parentPort.close();
})
}

 

이 코드에서 한개의 워커스레드는 parentPort.close()를 통해서 close가 됬다는것을 mainThread에 알려줘야만 worker의 exit 이벤트 (worker.on('exit'))가 실행되는걸로 이해를 했습니다 왜냐하면 저 코드에서 parentPort.close()만 없애면 프로세스가 끝나지않았기 때문입니다.

 

이와달리

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', (value) => console.log('워커로부터', value));
worker.on('exit', () => {
threads.delete(worker);
if (threads.size === 0) {
console.log('워커 끝')
}
});
}
}else {
parentPort.postMessage(workerData.start + 100);
}

 

워커스레드를 여러개 만들어서 간단히 100을더하는 코드는 parentPort.close()해주지 않았음에도 불구하고 worker의 exit이벤트(worker.on('exit'))를 호출할수 있고 프로세스가 정상적으로 종료가 되는지 궁금합니다

 

threads Set에서 워커스레드를 지워줬으니까 그런것 같은데 애초에 parentPort.close()해주지 않았는데 exit이벤트로 어떻게 들어가는지가 잘 이해가 안갑니다.

 

 

 

 

답변 2

·

답변을 작성해보세요.

0

김태희님의 프로필

김태희

질문자

2021.09.27

아하!! 정말 빠른 답변 감사합니다 :D

0

아래 예제에서는 parentPort.on 이 없어서 그렇습니다. 첫 예제에서는 이벤트리스너가 계속 대기중이므로 워커쓰레드가 종료되지 않고 기다렸던 겁니다.