English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

NodeJS Basic Tutorial

NodeJS Express.js

NodeJS Buffer&URL;

NodeJS MySql

NodeJS MongoDB

NodeJS File(FS)

Other NodeJS

Node.js多进程

We all know that Node.js runs in a single-threaded mode, but it uses event-driven to handle concurrency, which helps us create multiple child processes on multi-core CPU systems to improve performance.

Each child process always has three stream objects: child.stdin, child.stdout, and child.stderr. They may share the parent process's stdio streams or can also be independent piped stream objects.

Node.js provides the child_process module to create child processes, with methods such as:

  • exec - child_process.exec executes commands using a child process, caches the output of the child process, and returns the output of the child process as a callback function parameter.

  • spawn - child_process.spawn creates a new process using specified command line arguments.

  • fork - child_process.fork is a special form of spawn() used for running modules in child processes, such as fork('./son.js') is equivalent to spawn('node', ['./son.js']). Unlike the spawn method, fork establishes a communication channel between the parent and child processes, which is used for inter-process communication.

Метод exec()

Метод child_process.exec выполняет команду через процесс-дочерник, кэширует вывод процесса-дочерника и возвращает вывод процесса-дочерника в виде параметра回调-функции.

Синтаксис приведен ниже:

child_process.exec(command[, options], callback)

child_process.fork(modulePath[, args][, options])

参数

command: строка, команда для выполнения, параметры разделены пробелами

options : объект, может быть:

  • cwd, строка, текущий рабочий каталог процесса-дочерника

  • env, объект, ключи и значения переменных окружения

  • encoding, строка, кодировка символов (по умолчанию: 'utf8')

  • shell, строка, Shell для выполнения команды (по умолчанию: /bin/sh в UNIX, cmd.exe в Windows. Shell должен распознавать -c в UNIX или /s /c в Windows. В Windows, интерпретация командной строки должна быть совместима с cmd.exe)

  • timeout, число, время ожидания (по умолчанию: 0)

  • maxBuffer, число, максимальный буфер, который может существовать в stdout или stderr (бинарный), если он превышен, то процесс-дочерник будет убит (по умолчанию: 200*1024)

  • killSignal, строка, сигнал для завершения (по умолчанию: 'SIGTERM')

  • uid, число, устанавливает ID пользователя процесса

  • gid, число, устанавливает ID группы процессов

callback :Каллбэк-функция, содержащая три параметра error, stdout и stderr.

Метод exec() возвращает наибольший буфер, ожидает завершения процесса и возвращает содержимое буфера одним вызовом.

返回的对象除了拥有ChildProcess示例的所有方法,还有一个内建的通信信道。

在线示例

让我们创建两个js文件support.js和master.js。

support.js文件代码:

console.log("进程" + process.argv[2] + "执行。");

const fs = require('fs');
const child_process = require('child_process');
 
const fs = require('fs');const child_process = require('child_process');
    var workerProcess = child_process.exec('node support.js ' + i, function (error, stdout, stderr) {
        if (error) {
            console.log(error.stack);
            console.log('Код ошибки: ' + error.code);
            console.log('Получен сигнал: ' + error.signal);
        }
        console.log('stdout: '+stdout);
        console.log('stderr: '+stderr);
    });
 
    workerProcess.on('exit', function(code) {
        console.log('Подпроцесс exited, код выхода '+code);
    });
}

执行以上代码,输出结果为:

$ node master.js 
子进程已退出,退出码0
stdout: процесс 1 выполняется.
stderr: 
子进程已退出,退出码0
stdout: процесс 0 выполняется.
stderr: 
子进程已退出,退出码0
stdout: процесс 2 выполняется.
stderr:

метод spawn()

Метод spawn() создает новый процесс с указанными командными строковыми параметрами, формат синтаксиса следующий:

child_process.spawn(command[, args][, options])

child_process.fork(modulePath[, args][, options])

参数

command: Команда, которая будет выполняться

args: Array строковый массив параметров

options Object

  • :Object

  • cwd String子进程的当前工作目录

  • stdio Array|String конфигурация stdio подпроцесса

  • detached Boolean этот подпроцесс станет лидером группы процессов

  • silent Boolean如果为true,子进程的stdin,stdout和stderr将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false)

  • uid Number设置用户进程的ID

Метод spawn() возвращает потоки (stdout & stderr), они используются при необходимости обработки большого объема данных процессом. Метод spawn() начинает принимать ответы, как только процесс начинает выполнение.

返回的对象除了拥有ChildProcess示例的所有方法,还有一个内建的通信信道。

在线示例

Код файла support.js:

support.js文件代码:

Код файла master.js:

master.js文件代码: 
const fs = require('fs');const child_process = require('child_process');
   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('Подпроцесс exited, код выхода '+code); });

执行以上代码,输出结果为:

$ node master.js stdout: процесс 0 выполняется.
子进程已退出,退出码0
stdout: процесс 1 выполняется.
子进程已退出,退出码0
stdout: процесс 2 выполняется.
子进程已退出,退出码0

метод fork

child_process.fork является особой формой метода spawn(), предназначенного для создания процессов, формат синтаксиса следующий:

child_process.fork(modulePath[, args][, options])

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将会被关联至父进程,否则,它们将会从父进程中继承。(默认为:false)

  • uid Number设置用户进程的ID

gid Number设置进程组的ID

返回的对象除了拥有ChildProcess示例的所有方法,还有一个内建的通信信道。

在线示例

让我们创建两个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) {

执行以上代码,输出结果为:

$ node master.js 
进程0执行。
子进程已退出,退出码0
进程1执行。
子进程已退出,退出码0
进程2执行。
子进程已退出,退出码0