Node.js - приложение для масштабирования

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

У дочерних процессов всегда есть три потока child.stdin, child.stdout, и child.stderr которые могут использоваться совместно с потоками stdio родительского процесса.

Узел предоставляет child_process модуль, который имеет следующие три основных способа создания дочернего процесса.

  • exec - Метод child_process.exec запускает команду в оболочке / консоли и буферизует вывод.

  • spawn - child_process.spawn запускает новый процесс с заданной командой.

  • fork - Метод child_process.fork является частным случаем spawn () для создания дочерних процессов.

Метод exec ()

Метод child_process.exec запускает команду в оболочке и буферизует вывод. Он имеет следующую подпись -

child_process.exec(command[, options], callback)

Параметры

Вот описание используемых параметров -

  • command (Строка) Команда для запуска с аргументами, разделенными пробелами

  • options (Объект) может включать один или несколько из следующих вариантов:

    • cwd (Строка) Текущий рабочий каталог дочернего процесса

    • env (Объект) Пары "ключ-значение" среды

    • encoding (Строка) (По умолчанию: 'utf8')

    • shell (Строка) Оболочка для выполнения команды с (По умолчанию: '/ bin / sh' в UNIX, 'cmd.exe' в Windows, оболочка должна понимать переключатель -c в UNIX или / s / c в Windows. В Windows синтаксический анализ командной строки должен быть совместим с cmd.exe.)

    • timeout (Число) (По умолчанию: 0)

    • maxBuffer (Число) (по умолчанию: 200 * 1024)

    • killSignal (Строка) (По умолчанию: 'SIGTERM')

    • uid (Число) Устанавливает идентификатор пользователя процесса.

    • gid (Число) Устанавливает групповой идентификатор процесса.

  • callback Функция получает три аргумента error, stdout, и stderr которые вызываются с выходом, когда процесс завершается.

Метод exec () возвращает буфер максимального размера, ожидает завершения процесса и пытается вернуть все буферизованные данные сразу.

пример

Давайте создадим два js файла с именами support.js и master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');

for(var i=0; i<3; i++) {
   var workerProcess = child_process.exec('node support.js '+i,function 
      (error, stdout, stderr) {
      
      if (error) {
         console.log(error.stack);
         console.log('Error code: '+error.code);
         console.log('Signal received: '+error.signal);
      }
      console.log('stdout: ' + stdout);
      console.log('stderr: ' + stderr);
   });

   workerProcess.on('exit', function (code) {
      console.log('Child process exited with exit code '+code);
   });
}

Теперь запустите master.js, чтобы увидеть результат -

$ node master.js

Проверьте вывод. Сервер запущен.

Child process exited with exit code 0
stdout: Child Process 1 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 0 executed.

stderr:
Child process exited with exit code 0
stdout: Child Process 2 executed.

Метод spawn ()

Метод child_process.spawn запускает новый процесс с заданной командой. Он имеет следующую подпись -

child_process.spawn(command[, args][, options])

Параметры

Вот описание используемых параметров -

  • command (Строка) Команда для запуска

  • args (Массив) Список строковых аргументов

  • options (Объект) может включать один или несколько из следующих вариантов:

    • cwd (String) Текущий рабочий каталог дочернего процесса.

    • env (Объект) Пары "ключ-значение" среды.

    • stdio (Массив) String Конфигурация stdio ребенка.

    • customFds (Массив) Устаревшие файловые дескрипторы, которые дочерний элемент должен использовать для stdio.

    • detached (Boolean) Ребенок будет лидером группы процессов.

    • uid (Число) Устанавливает идентификатор пользователя процесса.

    • gid (Число) Устанавливает групповой идентификатор процесса.

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

пример

Создайте два файла js с именами support.js и master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i = 0; i<3; i++) {
   var workerProcess = child_process.spawn('node', ['support.js', i]);

   workerProcess.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
   });

   workerProcess.stderr.on('data', function (data) {
      console.log('stderr: ' + data);
   });

   workerProcess.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Теперь запустите master.js, чтобы увидеть результат -

$ node master.js

Проверьте вывод. Сервер запущен

stdout: Child Process 0 executed.

child process exited with code 0
stdout: Child Process 1 executed.

stdout: Child Process 2 executed.

child process exited with code 0
child process exited with code 0

Метод fork ()

Метод child_process.fork является частным случаем spawn () для создания процессов Node. Он имеет следующую подпись -

child_process.fork(modulePath[, args][, options])

Параметры

Вот описание используемых параметров -

  • modulePath (String) Модуль для запуска в дочернем элементе.

  • args (Массив) Список строковых аргументов

  • options (Объект) может включать один или несколько из следующих вариантов:

    • cwd (String) Текущий рабочий каталог дочернего процесса.

    • env (Объект) Пары "ключ-значение" среды.

    • execPath (String) Исполняемый файл, используемый для создания дочернего процесса.

    • execArgv (Массив) Список строковых аргументов, переданных исполняемому файлу (по умолчанию: process.execArgv).

    • silent (Boolean) Если true, stdin, stdout и stderr дочернего элемента будут переданы по конвейеру родителю, в противном случае они будут унаследованы от родителя, см. Параметры «pipe» и «наследование» для stdio spawn () для получения дополнительной подробности (по умолчанию false).

    • uid (Число) Устанавливает идентификатор пользователя процесса.

    • gid (Число) Устанавливает групповой идентификатор процесса.

Метод fork возвращает объект со встроенным каналом связи в дополнение к наличию всех методов в обычном экземпляре ChildProcess.

пример

Создайте два файла js с именами support.js и master.js -

File: support.js

console.log("Child Process " + process.argv[2] + " executed." );

File: master.js

const fs = require('fs');
const child_process = require('child_process');
 
for(var i=0; i<3; i++) {
   var worker_process = child_process.fork("support.js", [i]);	

   worker_process.on('close', function (code) {
      console.log('child process exited with code ' + code);
   });
}

Теперь запустите master.js, чтобы увидеть результат -

$ node master.js

Проверьте вывод. Сервер запущен.

Child Process 0 executed.
Child Process 1 executed.
Child Process 2 executed.
child process exited with code 0
child process exited with code 0
child process exited with code 0