[聚合文章] node.js创建子进程

JavaScript 2017-12-19 22 阅读

node本身为单进程,并使用驱动模式处理并发,为了解决单进程在多核cpu上的资源浪费,node提供了cluster和child_process模块来创建多个子进程。
每个子进程总带有三个流对象:child.stdin、child.stdout、child.stderr。他们可能会共享父进程的stdio流。
这里我们先介绍利用child_process模块中exec、spawn、fork三个方法对子进程的操作。
建立node-childProcess文件,在其中创建node-childPro.js文件。
其中就一行代码如下:

console.log("进程 " + process.argv[2] + " 执行。" );//换成下面的查看process.argv//console.log("进程 " + process.argv + " 执行。" );
exec()方法

在node-childProcess文件中新建node-childPro-exec.js文件,其中代码如下:

const fs = require('fs');const child_process = require('child_process');for (var i = 0; i < 3; i++) {    //这里有空格请注意。分别代表node路径 node-childPro.js路径 i第几个进程。 node-childPro.js中的process.argv可以获取这些信息值    var childProcess = child_process.exec('node node-childPro.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);        });    childProcess.on('exit', function (code) {        console.log('子进程已退出,退出码 ' + code);    });}

终端执行代码结果如下:

G:\node\node-childProcess> node node-childPro-exec.js子进程已退出,退出码 0stdout: 进程 0 执行。stderr:子进程已退出,退出码 0stdout: 进程 1 执行。stderr:子进程已退出,退出码 0stdout: 进程 2 执行。stderr:
spawn()方法

在node-childProcess文件中新建node-childPro-spawn.js,其中代码如下:

const fs = require('fs');const child_process = require('child_process'); for(var i=0; i<3; i++) {   var childProcess = child_process.spawn('node', ['node-childPro-spawn.js', i]);            childProcess.stdout.on('data', function (data) {      console.log('stdout: ' + data);   });childProcess.stderr.on('data', function (data) {      console.log('stderr: ' + data);   }); childProcess.on('close', function (code) {      console.log('子进程已退出,退出码 '+code);   });}

终端执行代码结果如下:

G:\node\node-childProcess> node node-childPro-spawn.jsstdout: 进程 0 执行。子进程已退出,退出码 0stdout: 进程 1 执行。stdout: 进程 2 执行。子进程已退出,退出码 0子进程已退出,退出码 0
fork()方法

在node-childProcess文件中新建node-childPro-fork.js,其中代码如下:

const fs = require('fs');const child_process = require('child_process'); for(var i=0; i<3; i++) {   var childProcess = child_process.fork("node-childPro.js", [i]);      childProcess.on('close', function (code) {      console.log('子进程已退出,退出码 ' + code);   });}

终端执行代码结果如下:

G:\node\node-childProcess> node node-childPro-fork.js进程 0 执行。进程 1 执行。子进程已退出,退出码 0进程 2 执行。子进程已退出,退出码 0子进程已退出,退出码 0
关于exec、spawn、fork

1.exec函数是对spawn的一种友好封装,增加Shell命令解析,可以直接嵌入复杂的命令
2.exec函数缓存子进程的输出,并将子进程的输出以回调函数参数的形式返回
3.spawn在子线程开始执行后,就开始不断将数据从子进程返回给主进程(应用场景如“系统监控”)
4.spawn是不支持callback函数的,它通过流的方式发数据传给主进程,从而实现了多进程之间的数据交换
5.fork()是spawn()的特殊情景,用于派生Node进程。除了普通ChildProcess实例所具有的所有方法,所返回的对象还具有内建的通讯通道。

原文地址https://gitee.com/wangFengJ/node/tree/master/node-childProcess

注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。