文档章节

Node.js中的child_process及进程通信

conans1
 conans1
发布于 2014/06/05 23:38
字数 710
阅读 387
收藏 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.js多线程

伴随10.5.0的发布,Node.js 新增了对多线程的实验性支持(worker_threads模块)。 为什么需要多线程? Node.js由于JS的执行在单一线程,导致CPU密集计算的任务可能会使主线程会处于繁忙的状态...

a独家记忆
06/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

EventBus原理深度解析

一、问题描述 在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于Event...

yangjianzhou
15分钟前
2
0
OpenCV图像处理实例:libuv+cvui显示摄像头视频

#include <iostream>#include <opencv2/opencv.hpp>#define CVUI_IMPLEMENTATION#include <cvui.h>extern "C"{#include <uv.h>}using namespace std;#define WINDOW_NAM......

IOTService
22分钟前
1
0
openJDK之JDK9的String

1.openJDK8的String 先来看下openJDK8的String的底层,如下图1.1所示: 图1.1 底层上使用的是char[],即char数组 每个char占16个bit,Character.SIZE的值是16。 2.openJDK9中的String 图2.1...

克虏伯
23分钟前
1
0
UEFI 模式下如何安装 Ubuntu 16.04

作者:知乎用户 链接:https://www.zhihu.com/question/52092661/answer/259583475 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 针对UEFI模式下安装U...

寻知者
24分钟前
1
0
20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
53分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部