Node.js 开发多进程应用
使用 child_process 模块可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程之间的互相通信来实现信息的交换,多个子进程之间也可以通过共享端口的方式将请求分配给多个子进程来执行。
使用 spawn 方法开启子进程
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();
使用 fork 方法
上面提到的 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 方法
exec 方法用于运行某个命令的子进程并缓存子进程的输出结果,这个方法很像spawn方法,区别在于 spawn 方法是对子进程的输入输出实时接收,而 exec 必须等到子进程的输出数据全部缓存成功才能接收数据,直观上的表现就是spawn方法异步,而 exec 方法同步。exec 方法使用如下:
exec(command, [options], [callback]):同样 command 为命令,option 为开启进程的选项,同样有 cwd、env、encoding 属性,这里需要注意的是 timeout 属性,这个属性用于指定子进程的超时时间,单位是毫秒,当子进程运行时间超过该时间时,将强制关闭该子进程,默认值为 0,即不限定时间,callback 则为终止子进程触发的回调函数。
使用 execFile 方法
execFile 方法是专门用于开启运行某个可执行文件的子进程,使用如下:
execFile(file,[args], [options], [callback]):使用方法一目了然,options 和 callback 的使用和 exec() 方法一致。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
上一篇: 动手实现一个 AMD 模块加载器(二)
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论