Nodejs教程-Node.js 子进程
Nodejs教程-Node.js的child_process模块提供了类似于popen(3)的功能,用于创建子进程。
有三种主要方式创建子进程:
- child_process.exec()方法: 该方法在控制台中运行命令并缓冲输出。
- child_process.spawn()方法: 该方法使用给定的命令启动一个新进程。
- child_process.fork()方法: 该方法是spawn()方法的一种特殊情况,用于创建子进程。
Node.js child_process.exec()方法
child_process.exec()方法在控制台中运行命令并缓冲输出。
语法:
- child_process.exec(command[, options], callback)
参数:
1) command:指定要运行的命令,包含空格分隔的参数。
2) options:可能包含以下一个或多个选项:
- cwd: 指定子进程的当前工作目录。
- env: 指定环境变量的键值对。
- encoding: 字符串(默认:'utf8')
- shell: 指定要使用的Shell(默认:UNIX上为'/bin/sh',Windows上为'cmd.exe',Shell应该理解UNIX上的-c开关或Windows上的/s /c开关。在Windows上,命令行解析应与cmd.exe兼容。)
- timeout: 数字(默认:0)
- maxBuffer: 数字(默认:200*1024)
- killSignal: 字符串(默认:'SIGTERM')
- uid Number: 设置进程的用户标识。
- gid Number: 设置进程的组标识。
callback: 回调函数接受三个参数error、stdout和stderr,当进程终止时调用该回调函数。
Node.js child_process.exec()示例1
让我们看一个简单的进程示例,打印进程的架构、进程ID、平台和版本。
文件:child_process_example1.js
const exec = require('child_process').exec;
exec('my.bat', (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(stdout);
});
创建一个名为my.bat的批处理文件,其中包含以下代码:
文件:my.bat
mkdir child
在Node.js命令提示符中运行以下代码:
node child_process_example1.js
它将执行两个命令dir和mkdir child。dir命令将显示当前目录列表,mkdir命令将创建一个新目录。对于Linux,您可以使用ls命令显示当前目录列表。
它还将创建一个新目录。
Node.js child_process.exec()示例2
创建两个名为support.js和master.js的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('Signal received: ' + error.signal);
}
console.log('stdout: ' + stdout);
console.log('stderr: ' + stderr);
});
workerProcess.on('exit', function (code) {
console.log('Child process exited with exit code ' + code);
});
}
在Node.js命令提示符中运行以下代码:
node master.js
Node.js child_process.spawn()方法
child_process.spawn()方法使用给定的命令启动一个新进程。该方法返回流(stdout和stderr),通常用于进程返回大量数据。
语法:
- child_process.spawn(command, args)
参数:
1) command:指定要运行的命令。
2) args:指定一个字符串参数数组列表。
3) options:可能包含以下一个或多个选项:
- cwd: 指定子进程的当前工作目录。
- env: 指定环境变量的键值对。
- stdio: 数组|字符串子进程的stdio配置
- customFds: 数组已弃用,用于子进程使用的stdio的文件描述符
- detached Boolean: 子进程将成为进程组的领导者
- uid Number: 设置进程的用户标识。
- gid Number: 设置进程的组标识。
Node.js child_process.spawn()示例
创建两个名为support.js和master.js的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);
});
}
在Node.js命令提示符中运行以下代码:
node master.js
Node.js child_process.fork()方法
child_process.fork方法是创建Node进程的一种特殊情况。此方法返回一个带有内置通信通道的对象,除了具有正常ChildProcess实例中的所有方法外。
语法:
- child_process.fork(modulePath, args)
参数:
1) modulePath:这是一个字符串,指定要在子进程中运行的模块。
2) args:指定一个字符串参数数组列表。
3) options:可能包含以下一个或多个选项:
- cwd: 指定子进程的当前工作目录。
- env: 指定环境变量的键值对。
- execPath: 这是一个字符串,用于创建子进程的可执行文件。
- execArgv: 指定一个字符串参数数组,传递给可执行文件(默认:process.execArgv)。
- silent: 指定布尔值,如果为true,则子进程的stdin、stdout和stderr将被传输给父进程,否则它们将从父进程继承,有关更多详细信息,请参见spawn()的stdio的“pipe”和“inherit”选项(默认为false)。
- uid Number: 设置进程的用户标识。
- gid Number: 设置进程的组标识。
Node.js child_process.fork()示例
创建两个名为support.js和master.js的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", [i]);
worker_process.on('close', function (code) {
console.log('child process exited with code ' + code);
});
}
在Node.js命令提示符中运行以下代码:
node master.js