Node.js Child Process — Создание и работа с дочерними процессами в Node

Node.js Child Process — Создание и работа с дочерними процессами в Node
5 (100%) 3 votes

Child Process — это модуль в Node.js, который можно подключить с помощью функции require(). Используя модуль child_process мы можем полноценно использовать функционал процессов. Ниже перечислены некоторые возможности модуля:

  • С помощью модуля child_process мы можем запускать команды shell. Shell — это командный язык высокого уровня, который используется в Unix как интерпретатор. Он совместим с Bash. С помощью простых Shell команд мы можем управлять сервером и написать сложные сценарий.
  • Модуль child_process позволяет запускать параллельные дочерние процессы.
  • Модуль child_process позволяет обмениваться сообщениями между собой.

 

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

Метод child_process.exec()

С помощью метода child_process.exec() мы можем запускать команды на выполнения. После выполнения результат будет сохранен в буфере.

Пример использование метода child_process.exec():

const exec = require("child_process").exec;

const child = exec('cat *.js not_exist_file | wc -1', {cwd: '/'}, (err, stdout, stderr) => {
  console.log('stdout: ' + stdout);
  console.log('stderr: ' + stderr);
  if(err){
    console.log('exec error: ' + err);
  }
});

Тут мы с помощью метода child_process.exec() запускаем shell-команду cat, выводящую содержимое нескольких файлов и через пайп передающую их команде wc, считывающей количество строк. Вторым аргументом передается массив параметров в данном случае мы изменяем рабочую директорию. Метод в качестве третьего аргумента принимает функцию, который принимает 3 параметра. Первый параметр — это объект ошибки, а второй и третий — это потоки stdout и stderr. Ценность команды состоит в возможности действий с полученными результатами.

Метод child_process.spawn()

Следующий метод — это child_process.spawn(), который запускает команду в новом процессе, дескриптор которого становится доступным:

const spawn = require("child_process").spawn;
let ls = spawn('ls', ['-lh', '/user']);

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

ls.stderr.on('data', (data) => {
  console.log("stderr: " + data);
});

ls.on('close', (code) => {
  console.log("child process exited with code: " + data);
});

Здесь все просто — любой вывод исполняемой команды передается в поток stdout дочернего процесса (или stderr, если случилось ошибка), и мы связали обработчики именно с этими объектами. Мы видим, что поток выполняется параллельно с основным процессом и завершается с кодом 0, что свидетельствует об успехе.


Метод child_process.fork()

Следующий метод — это child_process.fork(), который запускает дочерним процессом новый процесс, порожденный самой Node.js. Ниже представлен простой пример работы данного метода:

const sp = require("child_process");

let child1 = cp.fork(`${__dirname}/sub1.js`);
let child2 = cp.fork(`${__dirname}/sub2.js`);

while(cp){
  console.log("running main");
}

Тут мы запускаем два дочерних процесса, исполняющих код, характеризующихся в файлах sub1.js и sub2.js, и создаем бесконечный цикл вывода сообщений. Ниже представлен содержимое дочерних процессов:

sub1.js:

while(1){
  console.log("running: process 1");
}

sub2.js:

while(1){
  console.log("running: process 2");
}

После запуска основного скрипта мы увидим, что все работает параллельно.

Метод child_process.send()

Последний метод, который будет рассмотрен в этом статье — это метод send() модуля Child Process. Он отсылает сообщения от одного процесса к другому:

main.js:

const sp = require("child_process");

let child = cp.fork(`${__dirname}/sub.js`);

child.on("message", (data) => {
  console.log("Main got message: " + data);
});

child.send({'hello': 'child'});

sub.js:

process.on("message", (m) => {
  console.log("Child got message: " + m);
});

process.send({'foo': 'bar'});

В виде сообщение также можно посылать команды управления.


Об авторе

<p>Занимаюсь программированием уже более 7 лет. Часто использую JavaScript (Node.js) и Python. Хобби — Квантовая механика и нейронные сети.</p>

Комментарии