nodejs 多进程child_process

nodejs多进程要引入child_process模块

const child_process = require('child_process')复制代码

多进程方法之一exec

exec 执行命令,它的返回值是一个对象,类似Event类的实例,可以通过on监听exit事件,回调函数中嵌入一个code返回退出码。

执行命令时,child_process会令一个子进程去运行字符串的命令,在window和linux下可以运行和系统有关系的独特的命令,比如ls。这样做的好处是不堵塞js现在正想要做的事情,而是分发出一个任务让另一个进程去完成,缺点也是有的,产生和销毁进程和进程通信会浪费计算资源和内存资源。nodejs程序占用内存不大,可以适当的增加进程来提高程序的执行效率,比如我想做一个计算任务的时候可以用exec去让C语言,亦或是其他语言去执行任务拿到返回值而不是在主进程中运算,nodejs的长处并不是计算,所以让nodejs去做自己更加擅长的IO操作是更好的。

const workerProcess = child_process.exec('node index1.js '+1,function(err,stdout,stderr){
    
})
workerProcess.on('exit',(code)=>{//默认退出码是0})复制代码

exec第一个参数是命令字符串String,第二个参数是回调函数Function,函数中传入三个参数,第一个是错误,第二个是命令行输出结果,第三个是命令行输出了错误。

第一个错误可能是node 打错比如(nnde)搞得命令执行不了,第三个错误可能是程序的错误而不是命令行命令的错误。

exec函数的返回值是一个子进程对象workerProcess,它可以监听子进程是否退出,我认为它其中的一个用处是在退出的时候才开始分发新的子进程防止进程数量无限制的增加。

多进程方法之二spwan

spwan和exec可以肉眼直接看出来的差别是spwan的参数是用数组包起来的,例如child_process.exec('node index.js');和child_process.spwan('node',['index.js'])。

除此之外,spwan返回的对象上载有流对象,分别是stdout和stderr,这两个对象可以监听数据流,stdout类似exec回调函数的第二个参数stdout,stderr类似于第三个参数,他们可以监听控制台输出的内容,以回调函数的参数的形式返回。workerProcess可以像exec一样监听退出事件,它的监听键是close,回调函数和exec的回调函数的参数一样,返回code且默认是0。

const workerProcess = child_process.spwan('node',['index.js']);
workerProcess.stdout.on('data',function(data){console.log('spawn cmd data :'+data);
})
workerProcess.stderr.on('data',function(data){console.log('spawn cmd error data :'+data);
})
workerProcess.on('close',function(code){console.log('spawn cmd close :'+code);
})复制代码

多进程方法之三fork

第三个方法和前两个方法在参数传递有明显的差别,那就是前两个方法要写完整的命令行命令字符串,fork 不用并且它只执行nodejs的文件并且不用带上node在前面。传递参数的方式和spawn 有点像,看看代码如下:

child_process.fork('index.js');
child_process.fork('index.js',[1,2,3]);//1,2,3 作为命令后面的参数,比如这命令翻译一下就是 node index.js 1 2 3,spwan也可以这样复制代码

1,2,3 作为命令后面的参数,比如这命令翻译一下就是 node index.js 1 2 3,spwan也可以这样子把参数带到后面,对于后面的参数可以通过process.argv.slice(2)来获取。

写这篇文章的目的是为了加深自己对于不熟悉知识点的记忆,如果能帮到人的话是一举多得。我记得好像cluster也可以用多进程?下次看到相关的内容我会总结补充