От автора: Node.js работает в однопоточном режиме, но для обработки параллелизма использует управляемую событиями парадигму. Это также облегчает создание дочерних процессов для параллельной обработки многоядерных систем на базе процессоров.
В дочерних процессах всегда есть три потока child.stdin , child.stdout и child.stderr, которые могут совместно использоваться потоками stdio родительского процесса. Существует модуль Node js child process, который поддерживает три основных способа создания дочернего процесса.
exec — метод child_process.exec запускает команду в оболочке/консоли и буферизует вывод.
spawn — child_process.spawn запускает новый процесс с помощью заданной команды.
fork — метод child_process.fork является особым случаем spawn() для создания дочерних процессов.
Метод exec()
Метод child_process.exec запускает команду в оболочке и буферизирует вывод. Он содержит следующую подпись:
1 |
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.)
—timeout (Number) — (По умолчанию: 0)
—maxBuffer (Number) — (по умолчанию: 200 * 1024)
—killSignal (String) — (по умолчанию: «SIGTERM»)
—uid (Number) — устанавливает идентификатор пользователя процесса.
—gid (Number) — устанавливает групповой идентификатор процесса.
callback — функция принимает три аргумента error , stdout и stderr, которые вызываются с выходными данными при завершении процесса.
Метод exec() возвращает буфер с максимальным размером и ожидает завершения процесса, после чего пытается сразу вернуть все буферизованные данные.
Пример
Создадим два js-файла с именем support.js и master.js —
Файл: support.js
1 |
console.log("Child Process " + process.argv[2] + " executed." ); |
Файл: master.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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:
1 |
$ node master.js |
В результате должен быть запущен сервер.
1 2 3 4 5 6 7 8 9 10 |
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 запускает новый процесс с помощью заданной командой. Он содержит следующую подпись:
1 |
child_process.spawn(command[, args][, options]) |
Параметры
Ниже приводится описание используемых параметров:
command (String) — запускаемая команда
args (Array) — список аргументов строки
options (Object) — может содержать один или несколько из следующих параметров:
—cwd (String) — текущий рабочий каталог дочернего процесса.
—env (Object) — пары ключ-значение среды.
—stdio (Array) — строка конфигурации stdio дочернего процесса.
—customFds (Array) — устаревшие дескрипторы файлов для дочерних элементов, которые будут использоваться для stdio.
—detached (Boolean) — дочерний процесс будет лидером группы процессов.
—uid (Number) — устанавливает идентификатор пользователя процесса.
—gid (Number) — устанавливает групповой идентификатор процесса.
Метод spawn() возвращает потоки (stdout & stderr), он должен использоваться, когда процесс возвращает большой объем данных. spawn() начинает принимать ответ, сразу после начала выполнения процесса.
Пример
Создайте два js-файла с именем support.js и master.js —
Файл: support.js
1 |
console.log("Child Process " + process.argv[2] + " executed." ); |
Файл: master.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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:
1 |
$ node master.js |
Проверьте вывод. Сервер запущен
1 2 3 4 5 6 7 8 9 |
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. Он содержит следующую подпись:
1 |
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» и «inherit» для stdio для spawn() (по умолчанию — false).
—uid (Number) — Устанавливает идентификатор пользователя процесса.
—gid (Number) — Устанавливает групповой идентификатор процесса.
В дополнение к тому, что он содержит все методы, что и стандартный экземпляр дочернего процесса, метод fork возвращает объект со встроенным каналом связи.
Пример
Создайте два js-файла с именем support.js и master.js —
Файл: support.js
1 |
console.log("Child Process " + process.argv[2] + " executed." ); |
Файл: master.js
1 2 3 4 5 6 7 8 9 10 |
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:
1 |
$ node master.js |
В результате вы должны получить следующее.
1 2 3 4 5 6 |
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 |
Источник: //www.tutorialspoint.com/
Редакция: Команда webformyself.