Від автора: 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 запускає команду в оболонці і буферизують висновок. Він містить наступну підпис:
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
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(‘received Signal: ‘+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) — рядок конфігурації 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» і «inherit» для stdio для spawn() (за замовчуванням — false).
—uid (Number) — Встановлює ідентифікатор користувача процесу.
—gid (Number) — Встановлює груповий ідентифікатор процесу.
В додаток до того, що він містить всі методи, що і стандартний примірник дочірнього процесу, метод fork повертає об’єкт з вбудованим каналом зв’язку.
Приклад
Створіть два 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”, );
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