Node.js - это однопоточный язык, который в фоновом режиме использует несколько потоков для выполнения асинхронного кода.

Node.js является неблокирующим, что означает, что все функции (обратные вызовы) делегируются циклу событий и выполняются (или могут выполняться) разными потоками. Этим занимается среда выполнения Node.js.

  • Node.js поддерживает разветвление нескольких процессов (которые выполняются на разных ядрах).
  • Важно знать, что состояние не разделяется между главным и разветвленным процессом.
  • Мы можем передавать сообщения разветвленному процессу (это другой скрипт) и мастер-процессу из разветвленного процесса с помощью функции send.

Зачем и когда нам нужно форкнуть другой процесс?

  • Разветвление нескольких процессов необходимо для освобождения памяти и выгрузки одного процесса.
  • Когда нам нужно делегировать задачи (запускать их параллельно) другому процессу ради скорости.

Давайте посмотрим на этот пример:

У нас есть конечная точка REST, которая должна вызывать длительную функцию в теле:

server.js

const { fork } = require('child_process');
app.get('/endpoint', (request, response) => {
   // fork another process
   const process = fork('./send_mail.js');
   const mails = request.body.emails;
   // send list of e-mails to forked process
   process.send({ mails });
   // listen for messages from forked process
   process.on('message', (message) => {
     log.info(`Number of mails sent ${message.counter}`);
   });
   return response.json({ status: true, sent: true });
});

send_mail.js

async function sendMultipleMails(mails) {
   let sendMails = 0;
   // logic for
   // sending multiple mails
   return sendMails;
}
// receive message from master process
process.on('message', async (message) => {
  const numberOfMailsSend = await sendMultipleMails(message.mails); 
  
  // send response to master process
  process.send({ counter: numberOfMailsSend });
});

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