-
카테고리
-
세부 분야
풀스택
-
해결 여부
미해결
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