@drowzeenico

Как остановить процесс в node.js?

Добрый день всем.

Есть мастер процесс ноды, которая запускает несколько дочерних. Каждый из дочерних - это парсер, который получает данные от мастера. Все прекрасно работает, но заметил одну особенность - когда парсинг закончен, дочерний процесс не закрывается. Сутки бился над проблемой и выяснил, что нода не закрывается, если в стеке есть незаконченные обработчики. Стал копать, что же у меня висит в стеке до сих пор. И обнаружил, что это обработчик входящих сообщений от мастер-процесса:
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(), потому что процесс должен дождаться завершения всех задач.
  • Вопрос задан
  • 3047 просмотров
Решения вопроса 1
vitali1995
@vitali1995
Придётся всё же предложить process.exit()
На процесс навешены обработчики, поэтому он и не собирается завершаться сам.
Вызывать нужно после завершения всех задач - Promise в помощь.
По другому вряд ли удастся.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
pomeo
@pomeo
А child_process.exec вам чем не подгодит?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы