一.child_process


child_process是NodeJs的重要模块。帮助我们创建多进程任务,更好的利用了计算机的多核性能。

当然也支持线程间的通信。

二.child_process的几个API


异步:

child_process.exec(command[, options][, callback])

child_process.execFile(file[, args][, options][, callback])

child_process.fork(modulePath[, args][, options])

child_process.spawn(command[, args][, options])

同步:

child_process.execFileSync(file[, args][, options])

child_process.execSync(command[, options])

child_process.spawnSync(command[, args][, options])

事件:

Event: 'close'

Event: 'disconnect'

Event: 'error'

Event: 'exit'

Event: 'message'

三.child_process.spawn(command[, args][, options])


command:只执行的命令

args:参数列表

options:环境变量

先用一下:查询磁盘大小

var child_process = require('child_process');
var spawn = child_process.spawn; var wmic = spawn('wmic', ['DiskDrive', 'get', 'Size', '/value']); wmic.stdout.on('data', function(data) {
console.log('使用spawn方法输出: ' + data);
}); wmic.stderr.on('data', function(data) {
console.log('stderr: ' + data);
}); wmic.on('close', function(code) {
console.log('child process exited with code ' + code);
});

上面的命令在cmd中:wmic DiskDrive get Size /value

Node 通过 child_process 模块提供了类似 popen(3) 的处理三向数据流(stdin/stdout/stderr)的功能。

spawn()与exec(),execFile()的区别是:后两个创建时可以指定timeout属性设置超时时间,一旦创建的进程运行超过设定的时间将会被kill。

四.child_process.exec(command[, options][, callback])


exec添加了对shell命令的解析,可以执行复杂的命令。不需要像spawn一样分开写参数。并且有一个回调。

直接使用:wmic DiskDrive get Size /value

var child_process = require('child_process');
var exec = child_process.exec; exec('wmic DiskDrive get Size /value', function (error, stdout, stderr) {
if (error) {
console.log(error.stack);
console.log('Error code: '+error.code);
return;
}
console.log('使用exec方法输出: '+stdout);
console.log(`stderr: ${stderr}`);
});

如果没出错,error参数为null,退出码为0.只要不为0,就出错。

五.child_process.execFile(file[, args][, options][, callback])


不执行shell.

使用:

var execFile = require('child_process').execFile;
var child = execFile('node', ['--version'], (error, stdout, stderr) => {
if (error) {
throw error;
}
console.log(stdout);
});

六.child_process.fork(modulePath[, args][, options])


不同于spawn,fork函数会在进程间建立通讯通道。

使用:父子进程的通信。这个经常使用!

parent.js

//主进程
var childProcess = require('child_process');
var child = childProcess.fork('./child.js'); //接受来自子进程的消息
n.on('message', function(msg) {
console.log('来自子进程的消息: ', msg);
}); //发送消息给子(fork)进程
n.send({ hello: 'zqz' });

child.js

//子进程
//接受来自父进程的消息
process.on('message', function(msg) {
console.log('收到父进程的消息:', msg);
}); //向父进程发送消息
process.send({ Hello: 'Mr.zhao' });

七.close 事件


“关闭”事件在会在所有stdio流子进程关闭时候触发。这是有别于“退出”的事件,因为多个进程可以共享相同的stdio流。

八.disconnect 事件


在子进程或父进程中使用使用.disconnect()方法后,这个事件会被触发,在断开之后,就不可能再相互发送信息了。

可以通过检查子进程的child.connected属性是否为true去检查是否可以发送信息。

九.error 事件


触发的条件:

1.进程不能被创建, 或者

2.进程不能被终止掉, 或者

3.由任何原因引起的数据发送到子进程失败.

十.exit 事件


这个事件是在子进程被结束的时候触发的. 假如进程被正常结束,‘code’就是退出进程的指令代码, 否则为'null'. 假如进程是由于接受到signal结束的, signal 就代表着信号的名称, 否则为null.

十一.message 事件


通过.send()发送的信息可以通过监听'message'事件获取到。

NodeJs之child_process的更多相关文章

  1. nodejs的child_process同步异步

    nodejs是一种单线程模型,但是,使用nodejs的child_process模块可以实现多进程任务.利用child_process可以创建子进程,实现子进程和主进程之间的通信. nodejs v0 ...

  2. nodejs(二)child_process模块

    1.child_process是Node.js的一个十分重要的模块,通过它可以实现创建多进程,以利用多核计算资源. child_process模块提供了四个创建子进程的函数,分别是spawn,exec ...

  3. nodejs的child_process

    child_process  模块提供了衍生子进程的能力 异步方式:spawn.exec.execFile.fork 同步方式:spawnSync.execSync.execFileSync 说明: ...

  4. Nodejs进阶:如何玩转子进程(child_process)

    本文摘录自个人总结<Nodejs学习笔记>,更多章节及更新,请访问 github主页地址.欢迎加群交流,群号 197339705. 模块概览 在node中,child_process这个模 ...

  5. NodeJS学习笔记 (16)子进程-child_process(ok)

    原文: https://github.com/chyingp/nodejs-learning-guide/blob/master/README.md 自己的跟进学习: 父进程,子进程,线程之间的关系 ...

  6. Nodejs密集型CPU解决方案

    首先说一下nodejs单线程的优势: 高性能,与php相比,避免了频繁创建切换线程的开销,执行更加迅速,资源占用小. 线程安全,不用担心同一变量被多线程读写,造成程序崩溃. 单线程的异步和非阻塞,其实 ...

  7. nodejs顺序执行shell

    最近工作中需要用到nodejs编写脚本来顺序执行自动化测试用例,编写代码如下: var runCommand = function (command){ child_process.exec(comm ...

  8. 搭建前端私有npm杂记

    随着前端队伍越来越壮大,项目间共享代码就变得尤为重要.常用的框架/类库没必要在每个项目都放一份,团队内部产出的公共模块也需要有合理的共享机制.现在,用npm管理前端代码已经是业界趋势.楼主尝试用私有n ...

  9. 【Grunt】关于Grunt可视化的尝试

    使用Grunt遇到的问题? 必须要安装NodeJS 必须安装grunt-cli 需要编写复杂的Gruntfile.js规则 每个项目中必须存在nodejs的grunt模块 不方便管理每一个包含grun ...

随机推荐

  1. 避免重复造轮子的UI自动化测试框架开发

    一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...

  2. 通过一个demo了解Redux

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

  3. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  4. 在一个空ASP.NET Web项目上创建一个ASP.NET Web API 2.0应用

    由于ASP.NET Web API具有与ASP.NET MVC类似的编程方式,再加上目前市面上专门介绍ASP.NET Web API 的书籍少之又少(我们看到的相关内容往往是某本介绍ASP.NET M ...

  5. TODO:GitHub创建组织的步骤

    TODO:GitHub创建组织的步骤 使用GitHub进行团队合作,写这个步骤主要作用是为了OneTODO作为一个团队组织进行代码的分享,让更多人来参与. 使用帐号.密码登录GitHub 2.右上角加 ...

  6. Win10 IIS本地部署MVC网站时不能运行?

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 部署后出现这个错误: 打开文件目录后发现是可以看见目录的,静态页面也是可以打开的 ...

  7. Python-Jenkins API使用 —— 在后端代码中操控Jenkins

    最近在工作中需要用到在后台代码中触发Jenkins任务的构建,于是想到Jenkins是否有一些已经封装好的API类库提供,用于处理跟Jenkins相关的操作.下面就简单介绍下我的发现. Linux C ...

  8. 再部署一个 instance 和 Local Network - 每天5分钟玩转 OpenStack(131)

    上一节部署了 cirros-vm1 到 first_local_net,今天我们将再部署 cirros-vm2 到同一网络,并创建 second_local_net. 连接第二个 instance 到 ...

  9. AFNetworking 3.0 源码解读(十一)之 UIButton/UIProgressView/UIWebView + AFNetworking

    AFNetworking的源码解读马上就结束了,这一篇应该算是倒数第二篇,下一篇会是对AFNetworking中的技术点进行总结. 前言 上一篇我们总结了 UIActivityIndicatorVie ...

  10. setCapture、releasCapture 浅析

    1. setCapture 简介 setCapture可以将鼠标事件锁定在指定的元素上,当元素捕获了鼠标事件后,该事件只能作用在当前元素上. 以下情况会导致事件锁定失败: 当窗口失去焦点时,锁定的事件 ...