Node.js - process.exit () против childProcess.kill () - PullRequest
0 голосов
/ 12 ноября 2018

У меня есть приложение узла, которое запускает долго выполняющиеся задачи, поэтому, когда задача запускается, дочерний процесс разветвляется для запуска задачи.Код создает ответвление для запуска задачи и отправляет сообщение дочернему процессу для запуска.

Первоначально, когда задача была выполнена, я отправлял сообщение обратно в родительский процесс, и родительский процесс вызывал .kill () для дочернего процесса.Я заметил в своем мониторе активности, что процессы узла не были удалены.Все дочерние процессы торчали.Поэтому вместо отправки сообщения родителю и вызова .kill () я вызвал process.exit () в коде дочернего процесса, как только задача была выполнена.

Второй подход, кажется, работает нормально, и явижу, как процессы узлов удаляются из монитора активности, но мне интересно, есть ли у этого подхода недостатки, о которых я не знаю.Один метод лучше, чем другой?В чем разница между этими двумя методами?

Мой код выглядит так для подхода обмена сообщениями.

//Parent process
    const forked = fork('./app/jobs/onlineConcurrency.js');
    forked.send({clientId: clientData.clientId, 
            schoolYear: schoolYear
        });
    forked.on("message", (msg) => {
        console.log("message", msg);
        forked.kill();
    });

//child Process 
process.on('message', (data) => {
    console.log("Message recieved");
    onlineConcurrencyJob(data.clientId, data.schoolYear, function() {
        console.log("Killing process");
        process.send("done");
    });
})

Код выглядит так для дочернего процесса при выходе из

//child Process 
process.on('message', (data) => {
    console.log("Message received");
    onlineConcurrencyJob(data.clientId, data.schoolYear, function() {
        console.log("Killing process");
        process.exit();
    });
})

1 Ответ

0 голосов
/ 12 ноября 2018

kill отправляет сигнал дочернему процессу.Без аргумента он отправляет SIGTERM (где TERM - сокращение от «завершение»), что обычно, как следует из названия, завершает процесс.

Однако отправкаподобный сигнал является вынужденным методом остановки процесса.Если процесс выполняет такие задачи, как запись в файл, и он получает сигнал завершения, это может привести к повреждению файла, поскольку у процесса нет возможности записать все данные в файл и закрыть его (для этого есть мерынапример, установка обработчика сигналов, который можно использовать для «перехвата» сигналов и их игнорирования или завершения всех задач перед выходом, но для этого требуется явный код, добавляемый в дочерний процесс).

В то время как с process.exit() процесс завершается сам .И, как правило, он делает это в тот момент, когда ему известно, что больше нет ожидающих выполнения задач, поэтому он может выйти чисто.Вообще говоря, это лучший способ остановить (дочерний) процесс.

Что касается того, почему процессы не удаляются, я не уверен.Может случиться так, что родительский процесс не очищает ресурсы для дочерних процессов, но я ожидаю, что это произойдет автоматически (я даже не думаю, что вы можете явно выполнить так называемый «дочерний процесс» в Node.js).

...