Дочерние процессы в 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()
для связи с дочерним процессом через