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