文档章节

Node.js中的child_process及进程通信

conans1
 conans1
发布于 2014/06/05 23:38
字数 710
阅读 386
收藏 0
点赞 0
评论 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
学习 Node.js 笔记(二)

继续学习 Node.js == 文件操作 == NodeJS 对比浏览器中的 js 重点(进步)是能操作文件... 通过内模块 `fs' (文档...) 实验一下, 进入 node 交互命令行: > var fs = require('fs'); // 引入 fs...

刘军兴
2015/11/26
49
0
一个前端工程师眼里的NodeJS

JavaScript单线程的误解   在我接触JavaScript(无论浏览器还是NodeJS)的时间里,总是遇到有朋友有多线程的需求。而在NodeJS方面,有朋友甚至直接说到,NodeJS是单线程的,无法很好的利用...

大德
2012/09/25
0
0
Node.js process 模块解读

process存在于全局对象上,不需要使用require()加载即可使用,process模块主要做两方面的事情 获取进程信息(资源使用、运行环境、运行状态) 执行进程操作(监听事件、调度任务、发出警告)...

Randal
05/30
0
0
exec与spawn方法的区别与陷阱

起因 前几天之前写的一段程序突然报了个诡异的异常"maxBuffer exceeded",追进去发现是在一个上传的模块中解压缩的时候调用了child_process.exec方法,在解压某个上传文件的时候抛异常了。而...

KelvinQ
2014/01/27
0
0
node 多线程 cluster

上篇 Node.js 诞生之初就遭到不少这样的吐槽,当然这些都早已不是问题了。 1、可靠性低。 2、单进程,单线程,只支持单核 CPU,不能充分的利用多核 CPU 服务器。一旦这个进程崩掉,那么整个 ...

fymoon
2016/10/30
27
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决dokuwiki创建中文词条文件乱码问题

若直接创建中文词条,打开本地文件夹\dokuwiki\data\pages你会发现,中文字段显示的是URL乱码,需要改一下utf8格式,方法如下:(linux系统亲测有效) 打开 .dokuwiki\conf\local.php 添加一行...

Rhymo-Wu
1分钟前
0
0
设置圆角长条progressbar背景色

1、首先在Drawable下面新建一个xml文件,将这段代码复制进去 <?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-......

王先森oO
1分钟前
0
0
Java语言学习(九):异常处理

异常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。常见的三种异常类型有: 检查性异常,如打开一个不存在的文件 运行时异常,如数组越界 错误,如栈溢出 ...

海岸线的曙光
5分钟前
0
0
深入分析golang多值返回以及闭包的实现

一、前言 golang有很多新颖的特性,不知道大家的使用的时候,有没想过,这些特性是如何实现的?当然你可能会说,不了解这些特性好像也不影响自己使用golang,你说的也有道理,但是,多了解底...

万建宁
5分钟前
0
0
img与background-image之间的区别

1.img <img src="图片来源" alt="图片无法显示时显示图片说明性文字" style="设置样式属性" /> img标签虽然不是块状元素,但是可以设置宽高,占位, img设置width后height会自适应匹配,如果...

爱喝水的小熊
7分钟前
0
0
Swift - 添加提示音

func createSound() { //建立的SystemSoundID对象 var soundID:SystemSoundID = 123 //获取声音地址 let path = Bundle.main.path(forResource: "3quan......

west_zll
9分钟前
0
0
为图片写水印的时候中文乱码

缘由:源代码在本地win7 操作系统添加水印正常,但在linux 7.4 上 添加水印乱码(空心方格) 问题的本质是在linux 操作系统中没有对Font 类支持的字体,才会出现乱码 问题截图: 1.系统linux...

qimh
10分钟前
0
0
微信小游戏子域和主域

1、主域只能够设置自身的敏感属性值 2、子域只能够读取自身、朋友、群友的敏感属性值

微信小程序-暗潮
10分钟前
0
0
Django时区详解

引言 相信使用Django的各位开发者在存储时间的时候经常会遇到这样子的错误: RuntimeWarning: DateTimeField received a naive datetime while time zone support is active. 这个错误到底...

bobway
15分钟前
0
0
改造工程步骤

背景: 对于存在有问题的项目(包括 代码不规范 数据库表命名不规范 )需要改造 步骤: 1 新建工程 : 将需要改造的项目拷贝一份 修改项目名称 2 将相应的表结构拷贝到新的数据库中 修改不直...

猿神出窍
22分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部