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

В Node.js есть три типа дочерних процессов:

  • child_process.spawn() — запускает новый процесс и разрешает связь с ним через каналы.
  • child_process.exec() — запускает новый процесс и буферизует вывод.
  • child_process.fork() — запускает новый процесс Node.js и разрешает связь с ним через IPC (межпроцессное взаимодействие).

Использование child_process.spawn()

Метод child_process.spawn() запускает новый процесс и разрешает связь с ним через каналы. Вот пример:

const { spawn } = require('child_process');

const ls = spawn('ls', ['-lh', '/usr']);

ls.stdout.on('data', (data) => {
  console.log(`stdout: ${data}`);
});

ls.stderr.on('data', (data) => {
  console.error(`stderr: ${data}`);
});

ls.on('close', (code) => {
  console.log(`child process exited with code ${code}`);
});

В этом примере переменная ls порождает новый процесс, выполняющий команду ls с аргументами -lh /usr. События stdout и stderr прослушивают данные из дочернего процесса, а событие close прослушивает выход дочернего процесса.

Использование child_process.exec()

Метод child_process.exec() запускает новый процесс и буферизует вывод. Вот пример:

const { exec } = require('child_process');

exec('ls -lh /usr', (err, stdout, stderr) => {
  if (err) {
    console.error(`exec error: ${err}`);
    return;
  }
  console.log(`stdout: ${stdout}`);
  console.error(`stderr: ${stderr}`);
});

В этом примере метод exec() запускает команду ls -lh /usr и буферизует вывод. Функция обратного вызова прослушивает аргументы err, stdout и stderr и записывает их в консоль.

Использование child_process.fork()

Метод child_process.fork() запускает новый процесс Node.js и позволяет взаимодействовать с ним через IPC (межпроцессное взаимодействие). Вот пример:

// main.js
const { fork } = require('child_process');

const child = fork('child.js');

child.on('message', (message) => {
  console.log(`message from child: ${message}`);
});

child.send('hello from parent');
// child.js
process.on('message', (message) => {
  console.log(`message from parent: ${message}`);
});

process.send('hello from child');

В этом примере файл main.js разветвляет новый процесс Node.js, выполняющий сценарий child.js. Событие message прослушивает сообщения от дочернего процесса, а метод send() отправляет сообщение дочернему процессу.

Сценарий child.js прослушивает сообщения от родительского процесса, используя метод process.on('message'), и отправляет сообщение обратно родительскому процессу, используя метод process.send().

В этой статье мы рассмотрели дочерние процессы в Node.js и способы их использования для запуска других программ или скриптов как отдельных процессов. Мы видели, как использовать child_process.spawn() для связи с дочерним процессом через