一.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'事件获取到。

最新文章

  1. 从零开始编写自己的C#框架(16)——Web层后端父类
  2. Java集合类学习笔记(Queue集合)
  3. 安装Nexus
  4. nginx反向代理、优化
  5. B-Tree算法分析与实现
  6. HTML元素大小和位置相对于谁的问题
  7. 身份证js验证
  8. Spring 学习笔记02
  9. Cordic 算法之 反正切
  10. .NetCore WebApi 添加 Log4Net
  11. CentOS7下安装Python3并保留Python2
  12. Flask最强攻略 - 跟DragonFire学Flask - 第十五篇 Flask-Script
  13. Java连接访问Oracle--Connection.setSavepoint()方法使用
  14. javascript 练习题目答案
  15. How to do if the GM MDI cant connect with the software
  16. QueryString中的加号变成空格解决方法
  17. 在“安装”阶段发生异常。 System.Security.SecurityException: 未找到源,但未能
  18. IDEA使用技巧:CamelCasePlugin插件
  19. C#中XML文档注释编译DLL引用到其它项目
  20. dedecms v5.5 final getwebshell exploit(datalistcp.class.php)

热门文章

  1. 谈谈一些有趣的CSS题目(九)-- 巧妙的实现 CSS 斜线
  2. [C#] 走进异步编程的世界 - 开始接触 async/await
  3. 深入浅出Redis-redis哨兵集群
  4. IdentityServer4 使用OpenID Connect添加用户身份验证
  5. linux拷贝命令,移动命令
  6. 【干货分享】流程DEMO-离职流程
  7. App 审核由于 IPv6 网络问题被拒
  8. mac好用的markdown编辑器
  9. Windows 上安装 Jekyll.
  10. FastClick 填坑及源码解析