Node.js — Масштабування додатку за допомогою child_process

19

Від автора: 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