child_process模块

191 阅读2分钟

@[TOC]

因为我的第三个项目是做一个自动化部署的网站,那么操作shell脚本肯定是必不可少的,所以学习一下 child_process模块的用法。

1、出现的原因

 node是单进程的,必然存在一个问题,就是无法充分利用cpu等资源。node提供了child_process模块来实现子进程,从而实现一个广义上的多进程的模式。通过child_process模块,可以实现1个主进程,多个子进程的模式,主进程称为master进程,子进程又称工作进程。在子进程中不仅可以调用其他node程序,也可以执行非node程序以及shell命令等等,执行完子进程后,以流或者回调的形式返回。

2、Node.js 流的概念

流不是 Node.js 特有的概念。 它们是几十年前在 Unix 操作系统中引入的,程序可以通过管道运算符(|)对流进行相互交互。

Node.js 的 stream 模块 提供了构建所有流 API 的基础。 所有的流都是 EventEmitter 的实例。

流的优势

相对于使用其他的数据处理方法,流基本上提供了两个主要优点:

  • 内存效率: 无需加载大量的数据到内存中即可进行处理。

  • 时间效率: 当获得数据之后即可立即开始处理数据,这样所需的时间更少,而不必等到整个数据有效负载可用才开始。

pipe()

从一个流注入到另一个流


src.pipe(dest1).pipe(dest2)

  


src.pipe(dest1)

dest1.pipe(dest2)

流驱动的 Node.js API

  • process.stdin 返回连接到 stdin 的流。

  • process.stdout 返回连接到 stdout 的流。

  • process.stderr 返回连接到 stderr 的流。

  • fs.createReadStream() 创建文件的可读流。

  • fs.createWriteStream() 创建到文件的可写流。

  • net.connect() 启动基于流的连接。

  • http.request() 返回 http.ClientRequest 类的实例,该实例是可写流。

  • zlib.createGzip() 使用 gzip(压缩算法)将数据压缩到流中。

  • zlib.createGunzip() 解压缩 gzip 流。

  • zlib.createDeflate() 使用 deflate(压缩算法)将数据压缩到流中。

  • zlib.createInflate() 解压缩 deflate 流。

child_process用法


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


const spawn = require('child_process').spawn;

let cat=cp.spawn('cat',['input.txt']);

cat.stdout.on('data', (data) => {

console.log(`stdout: ${data}`);

});