文档章节

Node.js中的child_process及进程通信

conans1
 conans1
发布于 2014/06/05 23:38
字数 710
阅读 390
收藏 0

child_process是Node.js的一个十分重要的模块,通过它可以实现创建多进程,以利用多核计算资源。

Node.js 0.8的child_process模块提供了四个创建子进程的函数,分别是spawn,exec,execFile和fork。其中spawn是最原始的创建子进程的函数,其他三个都是对spawn不同程度的封装。spawn只能运行指定的程序,参数需要在列表中给出,相当于execvp系统函数,而exec可以直接运行复杂的命令。

例如要运行ls -lh /usr,使用spawn需要写成spawn('ls', ['-lh', '/usr']),而exec只需exec('ls -lh /usr')。exec的实现原理是启动了一个系统shell来解析参数,因此可以是非常复杂的命令,包括管道和重定向。此外,exec还可以直接接受一个回调函数作为参数,回调函数有三个参数,分别是err, stdout,stderr,非常方便直接使用,例如:

child_process.exec('ls -lh /usr', function(err, stdout, stderr) {
  console.log(stdout);
});

如果使用spawn,则必须写成:

child = child_process.spawn('ls', ['-lh', '/usr']);
child.stdout.setEncoding('utf8');
child.stdout.on('data', function(data) {
  console.log(data);
});

execFile与spawn的参数相似,也需要分别指定执行的命令和参数,但可以接受一个回调函数,与exec的回调函数相同。它与exec的区别在于不启动独立的shell,因此相比更加轻量级。

fork函数用于直接运行Node.js模块,例如fork('./child.js'),相当于spawn('node', ['./child.js'])。与默认的spawn不同的是,fork会在父进程与子进程直接建立一个IPC管道,用于父子进程之间的通信。例如:

var n = child_process.fork('./child.js');
n.on('message', function(m) {
  console.log('PARENT got message:', m);
});
n.send({ hello: 'world' });

child.js的内容:

process.on('message', function(m) {
  console.log('CHILD got message:', m);
});
process.send({ foo: 'bar' });

其中父进程调用fork函数获取一个返回值,作为子进程的句柄,通过send函数发送信息,on('message')监听返回的信息,子进程通过内置的process对象相同的方法与父进程通信。

fork函数有一个问题,就是它只能运行JavaScript代码,如果你喜欢用CoffeeScript(或者其他任何编译到js的语言),是无法通过fork调用的。一个简单的方法是把代码编译到JavaScript再运行,但是很不方便,有没有什么办法呢?

答案是可以的,还是得回到spawn函数。spawn函数除了接受command, args外,还接受一个options参数。通过把options参数的stdio设为['ipc'],即可在父子进程之间建立IPC管道。例如子进程使用CoffeeScript:

child_process = require('child_process')
options =
  stdio: ['ipc']
child = child_process.spawn 'coffee', ['./child.coffee'], options

其中只要把spawn的第一个参数设置为运行对应脚本的解释器,即可运行,例如使用Continuation.js,只需child = child_process.spawn('continuation', ['./child.coffee'], options)。

本文转载自:https://www.byvoid.com/zhs/blog/node-child-process-ipc

共有 人打赏支持
上一篇: 杂想
conans1
粉丝 0
博文 25
码字总数 3281
作品 0
厦门
技术主管
私信 提问
node.js之cluster集群初探

为什么要用cluster? Node.js是一个单线程单进程模型,它是基于事件循环机制来进行调度处理,当有事件发生时,响应的callback就会被触发, 但是在任何时候,只会有一个callback被执行。当cal...

小鱼跳龙门
07/12
0
0
看到有网友说Node.js是支持多线程的,我在这里解释一下

Node.js确实有一个扩展,叫tagg,可以实现多线程。但实际上是这样的,它的这个多线程只是一个线程池,去执行一部分计算的任务。 EventLoop和IO的处理部分始终是单线程的,在任务线程中不能调...

matyhtf
2014/07/11
0
10
鼓捣phantomjs(二) node.js模块化集成

著作权所有:http://www.cnblogs.com/zeusro/ 引用(爬虫)不给稿费的,切你jj 追忆似屎年华 在上一篇post(http://www.cnblogs.com/zeusro/p/4185196.html)里面,我留下了3个坑没有填平。 ...

amiba.org
2014/12/27
0
0
Node.js child_process模块解读

在介绍child_process模块之前,先来看一个例子。 可以试一下使用上面的代码启动Node.js服务,然后打开两个浏览器选项卡分别访问/compute和/,可以发现node服务接收到/compute请求时会进行大量...

Randal
06/01
0
0
Node 11.2.0 发布,引入新的 HTTP 解析器

Node 11.2.0 发布了,此版本主要更新内容包括: deps: 支持新的实验性 HTTP 解析器 https://github.com/nodejs/node/pull/24059 timers: 修复了可能导致 setTimeout 按预期停止工作的问题 ht...

h4cd
11/16
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

人工智能起步-反向回馈神经网路算法(BP算法)

人工智能分为强人工与弱人工。 弱人工智能就包括我们常用的语音识别,图像识别等,或者为了某一个固定目标实现的人工算法,如:下围棋,游戏的AI,聊天机器人,阿尔法狗等。 强人工智能目前只...

Python女神
3分钟前
0
0
RabbitMQ Dead Letter Exchange

简称DLX 如果一个queue设置了DLX,那么在rabbitmq的管理控制台中的这个queue上就会多个标志,如图: 边上还有DLK,是dead-letter-routing-key的缩写。 队列中的消息,有可能是'dead-lettere...

wmzsonic
14分钟前
0
0
case when then

case具有两种格式。简单case函数和case搜索函数。 --简单case函数case sex when '1' then '男' when '2' then '女’ else '其他' end--case搜索函数case when sex = '1' the...

architect刘源源
21分钟前
0
0
Kubernetes探秘—kubelet的配置参数

kubelet是Kubernetes中的核心组件,需要在每一个节点安装,也是kubernetes集群启动的第一个服务。kubelet的参数存放在多个目录,修改时如果不完整就会导致各种错误,下面我们kubelet的参数存...

openthings
24分钟前
0
0
如何通过 MySQL 的二进制日志恢复数据库数据

经常有网站管理员因为各种原因和操作,导致网站数据误删,而且又没有做网站备份,结果不知所措,甚至给网站运营和盈利带来负面影响。所以本文我们将和大家一起分享学习下如何通过 MySQL 的二...

吴伟祥
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部