1. 流式处理
- 原理:Node.js 中的流(Stream)是处理流数据的抽象接口,通过流可以逐块读取和处理数据,而不是一次性将所有数据读入内存。子进程的
stdout
和 stderr
都是可读流。
- 示例代码:
const { spawn } = require('child_process');
const child = spawn('yourCommand', ['yourArgs']);
child.stdout.on('data', (chunk) => {
// 逐块处理数据
console.log('Received data:', chunk.toString());
});
child.stderr.on('data', (chunk) => {
console.error('Received error data:', chunk.toString());
});
child.on('close', (code) => {
console.log('子进程已退出,退出码:', code);
});
2. 限制缓冲区大小
- 原理:在创建子进程时,可以通过
options
设置 maxBuffer
选项,限制子进程输出缓冲区的大小。当缓冲区满时,子进程可能会被暂停,直到缓冲区的数据被读取。
- 示例代码:
const { spawn } = require('child_process');
const child = spawn('yourCommand', ['yourArgs'], {
maxBuffer: 1024 * 1024 // 设置缓冲区大小为1MB
});
child.stdout.on('data', (chunk) => {
console.log('Received data:', chunk.toString());
});
child.stderr.on('data', (chunk) => {
console.error('Received error data:', chunk.toString());
});
child.on('close', (code) => {
console.log('子进程已退出,退出码:', code);
});
3. 及时处理数据
- 原理:尽快处理子进程输出的数据,避免数据在缓冲区中堆积。可以使用
pipe
方法将子进程的输出直接管道到其他流,比如文件流或者网络流。
- 示例代码:将子进程输出写入文件
const { spawn } = require('child_process');
const fs = require('fs');
const child = spawn('yourCommand', ['yourArgs']);
const writeStream = fs.createWriteStream('output.txt');
child.stdout.pipe(writeStream);
child.stderr.on('data', (chunk) => {
console.error('Received error data:', chunk.toString());
});
child.on('close', (code) => {
console.log('子进程已退出,退出码:', code);
writeStream.end();
});
4. 定期清理数据
- 原理:如果需要在内存中缓存部分数据,可以定期清理不再需要的数据,防止内存占用持续增长。
- 示例代码:假设缓存数据到数组,定期清空数组
const { spawn } = require('child_process');
const dataCache = [];
const intervalId = setInterval(() => {
dataCache.length = 0; // 清空数组
}, 10000); // 每10秒清理一次
const child = spawn('yourCommand', ['yourArgs']);
child.stdout.on('data', (chunk) => {
dataCache.push(chunk);
// 处理数据
});
child.stderr.on('data', (chunk) => {
console.error('Received error data:', chunk.toString());
});
child.on('close', (code) => {
console.log('子进程已退出,退出码:', code);
clearInterval(intervalId);
});