Node.js以单线程模式运行,但是它使用事件驱动来处理并发,它还有助于创建子进程,以在基于多核CPU的系统上利用并行处理。
子进程始终具有三个流 child.stdin , child.stdout 和 child.stderr ,它们可以与父级的stdio流共享处理。
Node提供了 child_process 模块,该模块具有以下三种创建子进程的主要方法。
exec - child_process.exec 方法在shell /控制台中运行命令并缓冲输出。
spawn - child_process.spawn 使用给定命令启动新进程。
fork - child_process.fork 方法是spawn()创建子进程的特殊情况。
exec()方法
child_process.exec方法在Shell中运行命令并缓冲输出。它具有以下参数-
child_process.exec(command[, options], callback)
这是使用的参数的描述-
command(String) - 运行的命令,带有以空格分隔的参数
-
options(Object)可以包含以下一个或多个选项-
cwd (String) - 子进程的当前工作目录
env (Object) - 环境键值对
encoding(String) - 默认值:'utf8'
shell (String) - 用于使用以下命令执行命令的Shell
timeout(Number) - 默认值:0
maxBuffer (Number) - 默认值:200 * 1024
killSignal (String) - 默认值:'SIGTERM'
uid (Number) - 设置进程的用户身份。
gid (Number) - 设置进程的组标识。
回调该函数获取三个参数 error , stdout,和 stderr 进程终止时的输出。
exec()方法返回一个最大大小的缓冲区,等待进程结束,并尝试一次返回所有缓冲的数据。
让无涯教程创建两个名为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); }); }
现在运行master.is以查看输出-
$node master.js
验证输出。服务器已启动。
Child process exited with exit code 0 stdout: Child Process 1 executed. stderr: Child process exited with exit code 0 stdout: Child Process 0 executed. stderr: Child process exited with exit code 0 stdout: Child Process 2 executed.
spawn()方法
child_process.spawn方法使用给定命令启动新进程。它具有以下参数-
child_process.spawn(command[, args][, options])
这是使用的参数的描述-
command(String) 要运行的命令
args (Array) 字符串参数列表
-
options(Object )可以包含以下一个或多个选项-
cwd (String) - 子进程的当前工作目录。
env (Object) - 环境键值对。
stdio (Array) - 字符串子级的stdio配置。
customFds (Array) - 不推荐使用的子描述符,供子代用于stdio。
detached(Boolean) - 该子级将成为流程组负责人。
uid (Number) - 设置进程的用户身份。
gid (Number) - 设置进程的组标识。
spawn()方法返回流(stdout&stderr),当进程返回大量数据时应使用它。 一旦进程开始执行,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); }); }
现在运行master.is以查看输出-
$node master.js
验证输出。服务器已启动
stdout: Child Process 0 executed. child process exited with code 0 stdout: Child Process 1 executed. stdout: Child Process 2 executed. child process exited with code 0 child process exited with code 0
fork()方法
child_process.fork方法是spawn()创建Node进程的示例。它具有以下参数-
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) - 设置进程的用户身份。
gid (Number) - 设置进程的组标识。
fork方法除了将所有方法都包含在常规ChildProcess中之外,还返回带有内置通信通道的对象 。
创建两个名为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); }); }
现在运行master.is以查看输出-
$node master.js
验证输出。服务器已启动。
Child Process 0 executed. Child Process 1 executed. Child Process 2 executed. child process exited with code 0 child process exited with code 0 child process exited with code 0
参考链接
https://www.learnfk.com/nodejs/nodejs-scaling-application.html
标签:Node,executed,process,Child,无涯,js,master,child From: https://blog.51cto.com/u_14033984/9355571