NodeJs之child_process

一: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)的功能。

四: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‘事件获取到。

时间: 2024-12-13 15:22:12

NodeJs之child_process的相关文章

Nodejs密集型CPU解决方案

首先说一下nodejs单线程的优势: 高性能,与php相比,避免了频繁创建切换线程的开销,执行更加迅速,资源占用小. 线程安全,不用担心同一变量被多线程读写,造成程序崩溃. 单线程的异步和非阻塞,其实 nodejs底层访问I/O还是多线程的,阻塞/非阻塞与异步/同步是两个不同的概念,同步不代表阻塞,但是阻塞肯定就是同步:有点儿绕口,请听我举例,我去食堂打饭,我选择了A套餐,然后工作人员帮我去配餐,如果我就站在旁边,等待工作人员给我配餐,这种情况就称之为同步:若工作人员帮我配餐的同时,排在我后面的

Node.js 使用child_process 实现多进程

总 nodejs是一种单线程模型,但是,使用nodejs的child_process模块可以实现多进程任务.利用child_process可以创建子进程,实现子进程和主进程之间的通信. nodejs v0.12.7版本child_process提供以下同步和异步的方式创建进程: 异步创建: child_process.spawn(command[, args][, options]) options.stdio options.detached options.customFds child_p

NodeJs中的异步

原文引用https://www.dazhuanlan.com/2019/08/25/5d625d714f62a/ 这篇文章主要讨论NodeJs中的异步问题.使用NodeJs编写进程也一年多了,在公司实习的时候,公司两个项目的后台都是我负责使用NodeJs和Sails框架编写的.工作模式主要是我在服务器端提供RESTful接口,网页端通过AJAX方式获取服务端的数据.在做的过程中,遇到了许多问题,感触最深的是异步编程的思维习惯还不是适应的很好. 异步背景 其实,异步很早都有了,例如在操作系统中就有

Tornado学习记录五

因为目前是运维岗, tornado 主要是用来接收请求并执行检测任务,比如说,我起一个服务,用户将服务器IP或者主机名 Post 到 tornado, 然后 tornado 执行检测,比如就是 Ping,然后返回给用户结果. 假设是 ping -c 10 url,这个还是挺耗时的,在mac上测试大概 9s 左右,如果不是异步,这 9s 的时间服务器就不能响应其他请求,那这个服务显然是没法用的, 这时候就需要 tornado 的异步非阻塞了. 而执行 bash shell 这种,是需要开启多线程或

搭建前端私有npm杂记

随着前端队伍越来越壮大,项目间共享代码就变得尤为重要.常用的框架/类库没必要在每个项目都放一份,团队内部产出的公共模块也需要有合理的共享机制.现在,用npm管理前端代码已经是业界趋势.楼主尝试用私有npm+资源管理系统的方式搭建起一套前端资源仓库,用以在公司内部托管公共代码,并为开发环境提供代码源.本文记录一下搭建过程,或许可以给大家做个参考. 整体架构 搭建私有npm的话其实是非常简单的,github上有一个叫做sinopia(https://github.com/rlidwka/sinopi

深入Node.js的进程与子进程:从文档到实践

欢迎关注Github仓库,这是一个自2018年起持续更新的前端&算法开源博客.目前已有node学习.js面试笔记.css3动画设计.webpack4系列教程.设计模式.剑指offer·js版等多个系列. 仓库地址:https://github.com/dongyuanxin/blog 进程:process模块 process 模块是 nodejs 提供给开发者用来和当前进程交互的工具,它的提供了很多实用的 API.从文档出发,管中窥豹,进一步认识和学习 process 模块: 如何处理命令参数?

前端自动化部署的深度实践

年前我也在自动化部署这方面下了点功夫,将自己的学习所得在自动化部署的一小步,前端搬砖的一大步这篇博客中做了分享.感谢两位网友@_shanks和@TomCzHen的意见,让我有了继续优化部署流程的动力.本文主要是在自动化部署流程中,对版本管理和流程合理性等方面做了一些改进,配合规范的工作流,使用体验更佳! 更新日志自动生成 之前我都是手动修改CHANGELOG.md,用来记录更新日志,感觉操作起来有点心累,也不是很规范.好在已有前人种树,于是我就考虑利用conventional-changelog

[转]nodejs中的process模块--child_process.exec

1.process是一个全局进程,你可以直接通过process变量直接访问它. process实现了EventEmitter接口,exit方法会在当进程退出的时候执行.因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行. 在下面例子中,setTimeout里面的语句是没有办法执行到的. 1 process.on('exit', function () { 2 setTimeout(function () { 3 console.log('This will not ru

[转载]进程通信模块child_process——nodejs中间件系列

从零开始nodejs系列文章,将介绍如何利Javascript做为服务端脚本,通过Nodejs框架web开发.Nodejs框架是基于V8的引擎,是目前速度最快的Javascript引擎.chrome浏览器就基于V8,同时打开20-30个网页都很流畅.Nodejs标准的web开发框架Express,可以帮助我们迅速建立web站点,比起PHP的开发效率更高,而且学习曲线更低.非常适合小型网站,个性化网站,我们自己的Geek网站!! 关于作者 张丹(Conan), 创业者,程序员(Java,R,Jav