前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node.js开发多进程应用

Node.js开发多进程应用

作者头像
用户1515472
发布2019-07-24 14:26:53
1.4K0
发布2019-07-24 14:26:53
举报

使用child_process模块可以开启多个子进程,在多个子进程之间可以共享内存空间,可以通过子进程之间的互相通信来实现信息的交换,多个子进程之间也可以通过共享端口的方式将请求分配给多个子进程来执行。

使用spawn方法开启子进程

spawn(command, [args], [options]):第一个参数为命令,args为运行该命令需要使用的参数,options为开启子进程的选项,主要有cwd指定目录,stdio指定子进程的标准输入输出,其中stdio可以简要的使用inherit指定为子进程和父进程共享输入输出。

spawn方法返回一个隐式的代表子进程的ChildProcess对象,因此同样可以使用前面文章提到的process的各种属性、方法和事件。如下是一个简单的例子:

代码语言:javascript
复制
const spawn = require('child_process').spawn;

const child = spawn('node', ['test.js', 'one', 'two'],{
  cwd: './test',
  stdio: 'inherit'
});
代码语言:javascript
复制
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事件的回调函数中指定处理方式

代码语言:javascript
复制
child.on('error', function(err) {
	// 错误处理程序
})

如果我们需要强制关闭子进程,可以使用kill方法强制关闭子进程。

代码语言:javascript
复制
child.kill();

在默认情况下,只有子进程全部退出之后,父进程才能退出。有时候需要允许父进程退出,同时子进程继续运行,可以在开启子进程的时候使用参数detached,同时使用子进程的unref()方法允许父进程退出,如下

代码语言:javascript
复制
const child = spawn('node',['test.js'], {
	cwd: __dirname,
	stdio: 'inherit',
	detached: true
});

child.unref();

使用fork方法

上面提到的spawn方法运行的是一个命令进程,也就意味着不仅运行node命令了。而fork方法则是专门用于运行Node.js某个模块,使用方法如下:

代码语言:javascript
复制
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事件,因此可以实现父子进程的通信,如下就是一个简单的例子:

代码语言:javascript
复制
const fork = require('child_process').fork;

fork('./test/test.js',['123123123'], {
  cwd: __dirname,
  encoding: 'utf-8',
  slient: false
});
代码语言:javascript
复制
process.on('message', (m) => {
  console.log('子进程收到消息');
  console.log(m.userName);
});

process.send({age: 1200});

这时候运行主进程文件,运行效果如下:

11
11

使用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()方法一致。

方法暂时先介绍到这里,具体使用案例请期待下一篇文章。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用spawn方法开启子进程
  • 使用fork方法
  • 使用exec方法
  • 使用execFile方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档