Node.js отправляет сообщение от работника на событие выхода - PullRequest
1 голос
/ 19 сентября 2019

У меня есть приложение Node, создающее ряд рабочих процессов через fork() для самостоятельного выполнения некоторых задач.Как побочный продукт, рабочие производят снимок действий, предпринятых в форме объекта.У каждого работника есть прослушиватель событий, присоединенный к событию 'exit', когда они отправляют свой снимок обратно в родительский процесс с помощью process.send().

. Вот пример настройки:

// parent.js
const exec = require('child_process');

const worker = exec.fork('worker.js', [], {
  stdio: ['pipe', 'pipe', null, 'ipc']
});

worker.on('message', (snapshot) => {
  // Handle the snapshot sent from worker
});
// worker.js
process.on('exit', () => {
  process.send({ /* snapshot data */ })
});
/* Arbitrary task work */

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

Является ли событие beforeExit более подходящим для этого шаблона?

1 Ответ

0 голосов
/ 19 сентября 2019

В документе nodejs довольно ясно, что вы должны выполнять синхронные операции только в событии exit.Вот выдержка из документа для события exit :

Функции прослушивателя должны выполнять только синхронные операции.Процесс Node.js будет завершен сразу после вызова обработчиков событий 'exit', в результате чего любая дополнительная работа, все еще находящаяся в очереди в цикле событий, будет отменена.

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


Вы можетеделайте асинхронные вещи в событии beforeExit, поэтому вам, вероятно, следует это сделать.Выдержка из beforeExit doc :

Событие beforeExit генерируется, когда Node.js очищает свой цикл обработки событий и не имеет никакой дополнительной работы по расписанию.Обычно процесс Node.js завершается, когда работа не запланирована, но прослушиватель, зарегистрированный в событии beforeExit, может выполнять асинхронные вызовы и, таким образом, продолжать процесс Node.js.

СлушательФункция обратного вызова вызывается со значением process.exitCode, переданным в качестве единственного аргумента.

Событие beforeExit не генерируется для условий, вызывающих явное завершение, таких как вызов process.exit () или необработанные исключения.

'beforeExit' не должен использоваться в качестве альтернативы событию 'exit', если только не планируется запланировать дополнительную работу.

...