English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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.
Метод child_process.exec выполняет команду через процесс-дочерник, кэширует вывод процесса-дочерника и возвращает вывод процесса-дочерника в виде параметра回调-функции.
Синтаксис приведен ниже:
child_process.exec(command[, options], callback)
参数
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() возвращает наибольший буфер, ожидает завершения процесса и возвращает содержимое буфера одним вызовом.
在线示例
support.js文件代码:
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() создает новый процесс с указанными командными строковыми параметрами, формат синтаксиса следующий:
child_process.spawn(command[, 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() начинает принимать ответы, как только процесс начинает выполнение.
在线示例
support.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
child_process.fork является особой формой метода spawn(), предназначенного для создания процессов, формат синтаксиса следующий:
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
在线示例
support.js文件代码:
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