Добрый день всем.
Есть мастер процесс ноды, которая запускает несколько дочерних. Каждый из дочерних - это парсер, который получает данные от мастера. Все прекрасно работает, но заметил одну особенность - когда парсинг закончен, дочерний процесс не закрывается. Сутки бился над проблемой и выяснил, что нода не закрывается, если в стеке есть незаконченные обработчики. Стал копать, что же у меня висит в стеке до сих пор. И обнаружил, что это обработчик входящих сообщений от мастер-процесса:
if (cluster.isMaster) {
for (var i = 0; i < numCPUs; i++) {
let worker = cluster.fork();
worker.send(i);
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} has finished his job.`);
numberOfProcesses--;
if(numberOfProcesses <= 0) {
console.log(`Parsing was completed.`);
process.exit(0);
}
});
} else {
process.once('message', msg => {
// именно вот из-за этого обработчика процесс продолжает работать
console.log(process.pid, msg)
})
}
Даже когда указан "once", то есть, получить сообщение и сбросить обработчик. Все равно не заканчивает работу.
И теперь вопрос, почему он не закрывается и как убить дочерный процесс?
p.s.: только не предлагайте process.exit(), потому что процесс должен дождаться завершения всех задач.