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 }); });
В этом простом примере мы продемонстрировали, как вы можете отправлять данные разветвленному процессу и как вы можете отправить их обратно.