Node.js многопроцессной
Мы все знаем, что Node.js является однопоточный режим, но он используется для обработки параллельных управляемой событиями, которые помогут нам создать несколько суб-процессов на многоядерной системе центрального процессора, что повышает производительность.
Каждый ребенок всегда с тремя объектами потока: child.stdin, child.stdout и child.stderr. Они могут совместно использовать родительский процесс STDIO потока, или он также может управляться независимый объект потока.
Узел обеспечивает child_process модули для создания дочернего процесса, путем:
Exec - child_process.exec дочерний процесс использования Run, выходной буфер дочернего процесса, а выход дочернего процесса возвращается в виде функции обратного вызова параметров.
икру - child_process.spawn используя заданные параметры командной строки для создания нового процесса.
Вилка - child_process.fork является нерест () специальная форма для модуля , работающего в ребенка, такие как вилки ( './ son.js') соответствует грибницы ( "узел", [ ' ./son.js' ]).Разница заключается в метод икру, развилка между родителем и ребенком процесса, установить канал связи для обмена данными между процессами.
Exec () метод
child_process.exec дочерний процесс использования Run, выходной буфер дочернего процесса, а выход дочернего процесса возвращается в виде функции обратного вызова параметров.
Синтаксис выглядит следующим образом:
child_process.exec(command[, options], callback)
параметры
Параметры заключаются в следующем:
Команда: String, команда для запуска, параметры , разделенные пробелами
Параметры: объекты могут быть:
- Текущий рабочий каталог УХО, строка, дочерний процесс
- ENV, объект ключевых переменных окружающей среды
- кодирование, строка, кодировка символов (по умолчанию: 'utf8')
- оболочки, строка, чтобы выполнить команду Shell ( по умолчанию: на UNIX это
/bin/sh
, как в ОС Windowscmd.exe
, Shell должна быть в состоянии идентифицировать-c
переключатель в UNIX, или/s /c
в Windows. в Windows, командная строка синтаксического анализа совместимыcmd.exe
) - Тайм-аут, цифровой, тайм-аут (по умолчанию: 0)
- maxBuffer, цифровой, максимальный буфер в стандартный вывод или STDERR разрешено существовать (двоичный код), так что если ребенок будет убит за ее пределами (по умолчанию: 200 * 1024)
- killSignal, строка сигнала окончания (по умолчанию: 'SIGTERM')
- UID, цифровой, установите идентификатор пользователя процесса
- GID, цифровой, установить идентификатор группы процесса
Обратный вызов: Функция обратного вызова имеет три аргумента ошибки, STDOUT и STDERR.
Exec () метод возвращает максимальный буфер, и ждать окончания процесса, одноразовый возвращает содержимое буфера.
примеров
Давайте создадим два JS файлы support.js и master.js.
support.js код файла:
console.log("进程 " + process.argv[2] + " 执行。" );
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('子进程已退出,退出码 '+code); }); }
Реализация указанного выше кода, выход:
$ node master.js 子进程已退出,退出码 0 stdout: 进程 1 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 0 执行。 stderr: 子进程已退出,退出码 0 stdout: 进程 2 执行。 stderr:
икру () метод
child_process.spawn используя заданные параметры командной строки, чтобы создать новый процесс, синтаксис выглядит следующим образом:
child_process.spawn(command[, args][, options])
параметры
Параметры заключаются в следующем:
Команда: команда для запуска
арг: массив Массивпараметров строки
параметры объекта
- текущий рабочий каталог Cwd Строка дочернего процесса
- Объект среды ENV пары переменных ключ-значение
- STDIO Массив | STDIO конфигурации Строка подпроцесс
- отдельностоящий Boolean Этот ребенок станет лидером группы процессов
- UID Номер, чтобы установить идентификатор пользователя процесса
- GID Номер установлен идентификатор группы процессов
Метод грибницы () возвращает поток (STDOUT & к стандартному потоку ошибок), используемые в процессе, чтобы возвращать большие объемы данных. После того, как процесс начался, когда икру () начал получать ответ.
примеров
Давайте создадим два JS файлы support.js и master.js.
support.js код файла:
console.log("进程 " + process.argv[2] + " 执行。" );
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('子进程已退出,退出码 '+code); }); }
Реализация указанного выше кода, выход:
$ node master.js stdout: 进程 0 执行。 子进程已退出,退出码 0 stdout: 进程 1 执行。 子进程已退出,退出码 0 stdout: 进程 2 执行。 子进程已退出,退出码 0
вилка метод
child_process.fork является особой формой икру () для создания процессов, синтаксис выглядит следующим образом:
child_process.fork(modulePath[, args][, options])
параметры
Параметры заключаются в следующем:
ModulePath: String, для запуска в модуле дочернего процесса
арг: массив Массивпараметров строки
Варианты: Object
- текущий рабочий каталог Cwd Строка дочернего процесса
- Объект среды ENV пары переменных ключ-значение
- execPath Строка создать дочерний процесс исполняемого файла
- массив параметров Строка execArgv ребенка составлять список присяжных заседателей исполняемый файл (по умолчанию: process.execArgv)
- Если молчать Булева
true
, ребенкаstdin
,stdout
иstderr
будет связан с родительским процессом, в противном случае, они будут унаследованы от родительского процесса. ( По умолчанию:false
) - UID Номер, чтобы установить идентификатор пользователя процесса
- GID Номер установлен идентификатор группы процессов
Возвращаемый объект в дополнение ко всем методам есть экземпляр ChildProcess, есть встроенный канал связи.
h3> ПримерыДавайте создадим два JS файлы support.js и master.js.
support.js код файла:
console.log("进程 " + process.argv[2] + " 执行。" );
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('子进程已退出,退出码 ' + code); }); }
Реализация указанного выше кода, выход:
$ node master.js 进程 0 执行。 子进程已退出,退出码 0 进程 1 执行。 子进程已退出,退出码 0 进程 2 执行。 子进程已退出,退出码 0