Latest web development tutorials

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 , как в ОС Windows cmd.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