使用child_process模块可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程之间的互相通信来实现信息的交换,多个子进程之间也可以通过共享端口的方式将请求分配给多个子进程来执行。
spawn(command, [args], [options]):第一个参数为命令,args为运行该命令需要使用的参数,options为开启子进程的选项,主要有cwd指定目录,stdio指定子进程的标准输入输出,其中stdio可以简要的使用inherit指定为子进程和父进程共享输入输出。
spawn方法返回一个隐式的代表子进程的ChildProcess对象,因此同样可以使用前面文章提到的process的各种属性、方法和事件。如下是一个简单的例子:
const spawn = require('child_process').spawn;
const child = spawn('node', ['test.js', 'one', 'two'],{
cwd: './test',
stdio: 'inherit'
});
const fs = require('fs');
const out = fs.createWriteStream('./message.txt');
console.log('请输入:');
process.stdin.on('data', function(data) {
out.write(data)
});
process.stdin.on('end', function(data) {
process.exit()
});
如果子进程开启失败将会触发error事件,可以在这个error事件的回调函数中指定处理方式
child.on('error', function(err) {
// 错误处理程序
})
如果我们需要强制关闭子进程,可以使用kill方法强制关闭子进程。
child.kill();
在默认情况下,只有子进程全部退出之后,父进程才能退出。有时候需要允许父进程退出,同时子进程继续运行,可以在开启子进程的时候使用参数detached,同时使用子进程的unref()方法允许父进程退出,如下
const child = spawn('node',['test.js'], {
cwd: __dirname,
stdio: 'inherit',
detached: true
});
child.unref();
上面提到的spawn方法运行的是一个命令进程,也就意味着不仅运行node命令了。而fork方法则是专门用于运行Node.js某个模块,使用方法如下:
const fork = require('child_process').fork;
fork('./test/test.js',['123123123'], {
cwd: __dirname,
encoding: 'utf-8',
slient: false
});
上面列出了fork方法的使用,第一个参数为运行的node模块,第二个可选参数为一个运行的参数列表,最后为一个配置选项的对象,其中slient表示是否和父进程共享一个标准输入输出,false默认为父、子进程共享,此外还有一个env对象用来配置环境变量。 使用fork方法开启的子进程可以使用send()方法父子进程之间互发信息,接收到信息后会触发message事件,因此可以实现父子进程的通信,如下就是一个简单的例子:
const fork = require('child_process').fork;
fork('./test/test.js',['123123123'], {
cwd: __dirname,
encoding: 'utf-8',
slient: false
});
process.on('message', (m) => {
console.log('子进程收到消息');
console.log(m.userName);
});
process.send({age: 1200});
这时候运行主进程文件,运行效果如下:
exec方法用于运行某个命令的子进程并缓存子进程的输出结果,这个方法很像spawn方法,区别在于spawn方法是对子进程的输入输出实时接收,而exec必须等到子进程的输出数据全部缓存成功才能接收数据,直观上的表现就是spawn方法异步,而exec方法同步。exec方法使用如下: exec(command, [options], [callback]):同样command为命令,option为开启进程的选项,同样有cwd、env、encoding属性,这里需要注意的是timeout属性,这个属性用于指定子进程的超时时间,单位是毫秒,当子进程运行时间超过该时间时,将强制关闭该子进程,默认值为0,即不限定时间,callback则为终止子进程触发的回调函数。
execFile方法是专门用于开启运行某个可执行文件的子进程,使用如下: execFile(file,[args], [options], [callback]):使用方法一目了然,options和callback的使用和exec()方法一致。
方法暂时先介绍到这里,具体使用案例请期待下一篇文章。