Учебники

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 запускает команду в оболочке / консоли и буферизует вывод.

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

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

Метод exec ()

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

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

параметры

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

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

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

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

    • env (Object) Пары ключ-значение среды

    • encoding (String) (по умолчанию: ‘utf8’)

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

    • тайм-аут (число) (по умолчанию: 0)

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

    • killSignal (String) (по умолчанию: ‘SIGTERM’)

    • uid (Number) Устанавливает личность пользователя процесса.

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

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

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

options (Object) может содержать один или несколько из следующих параметров:

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

env (Object) Пары ключ-значение среды

encoding (String) (по умолчанию: ‘utf8’)

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

тайм-аут (число) (по умолчанию: 0)

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

killSignal (String) (по умолчанию: ‘SIGTERM’)

uid (Number) Устанавливает личность пользователя процесса.

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

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

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

пример

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

Файл: support.js

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

Файл: 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 (String) Команда для запуска

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

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

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

    • env (Object) Пары ключ-значение среды.

    • stdio (Array) String Конфигурация stdio дочернего элемента.

    • customFds (Array) Устаревшие дескрипторы файлов, которые потомки могут использовать для stdio.

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

    • uid (Number) Устанавливает личность пользователя процесса.

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

command (String) Команда для запуска

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

options (Object) может содержать один или несколько из следующих параметров:

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

env (Object) Пары ключ-значение среды.

stdio (Array) String Конфигурация stdio дочернего элемента.

customFds (Array) Устаревшие дескрипторы файлов, которые потомки могут использовать для stdio.

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

uid (Number) Устанавливает личность пользователя процесса.

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

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

пример

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

Файл: support.js

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

Файл: 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 (Array) Список строковых аргументов

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

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

    • env (Object) Пары ключ-значение среды.

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

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

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

    • uid (Number) Устанавливает личность пользователя процесса.

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

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

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

options (Object) может содержать один или несколько из следующих параметров:

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

env (Object) Пары ключ-значение среды.

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

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

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

uid (Number) Устанавливает личность пользователя процесса.

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

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

пример

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

Файл: support.js

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

Файл: 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

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