怎么看 "A New Streaming API for Nodejs v0.10"
怎么看 "A New Streaming API for Nodejs v0.10"
貌似有新动作了, Stream API 会发生改变…
A New Streaming API for Node v0.10 http://blog.nodejs.org/2012/12/21/streams2/ Fri, 21 Dec 2012 00:45:13 UTC - Isaac Z. Schlueter
不知道会涉及哪些方面, 求解读…
看怎么 “A New Streaming API for Node.js v0.10”
背景
Node.js v0.10 引入了一种新的流(Stream)API,称为 Streams2。这是一次重大的改进,旨在解决早期版本中流处理的一些限制,并提供更强大、更灵活的流操作能力。
改进点
Streams2 的主要改进包括:
- 背压(Backpressure)管理:自动处理数据过载问题,避免消费者跟不上生产者的速度。
- 内部缓冲区优化:减少内存使用,提高性能。
- 可读流(Readable Streams)和可写流(Writable Streams)的新方法:简化流的操作。
- 流的管道(Piping)更加灵活:支持更复杂的流组合。
示例代码
让我们通过一个简单的例子来理解这些改进。
示例 1:基本的读取和写入流
const fs = require('fs');
// 创建一个可读流
const readStream = fs.createReadStream('input.txt', { encoding: 'utf8' });
// 创建一个可写流
const writeStream = fs.createWriteStream('output.txt');
// 将可读流的数据传输到可写流
readStream.pipe(writeStream);
// 监听错误事件
readStream.on('error', (err) => {
console.error('Read error:', err);
});
writeStream.on('error', (err) => {
console.error('Write error:', err);
});
在这个例子中,pipe()
方法用于将 readStream
的数据直接传递给 writeStream
。Streams2 会自动处理背压,确保不会因为写入速度慢而导致内存溢出。
示例 2:处理数据
我们可以进一步处理读取的数据,在写入之前对其进行修改。
const fs = require('fs');
const readStream = fs.createReadStream('input.txt', { encoding: 'utf8' });
const writeStream = fs.createWriteStream('output.txt');
// 使用 transform 流处理数据
const transformStream = new (require('stream').Transform)({
transform(chunk, encoding, callback) {
// 处理每个数据块
const processedChunk = chunk.toUpperCase();
callback(null, processedChunk);
}
});
// 链接流
readStream.pipe(transformStream).pipe(writeStream);
readStream.on('error', (err) => {
console.error('Read error:', err);
});
writeStream.on('error', (err) => {
console.error('Write error:', err);
});
在这个例子中,我们创建了一个 Transform
流,它将每个数据块转换为大写形式,然后再写入文件。
结论
Streams2 提供了一种更高效、更灵活的方式来处理数据流。通过自动的背压管理和更丰富的流操作方法,开发者可以更容易地构建复杂的数据处理管道。希望这些示例能够帮助你更好地理解和应用 Streams2。
正在阅读ing~,感谢分享
解决了几个之前的遗留问题(pause不保证完全停止data事件,create之后会立刻开始读数据)。可以不通过事件,主动调用read方法来获取的数据。可以自定义底层的_read,_write等方法来定制stream,还封装了高一层的stream对象。
现有的stream就像一个水龙头,每次流出来的量是不能控制的,你需要盯着水桶,快满了就关掉水龙头,或者倒掉桶里的水。
新的stream2升级了,可以直接告诉它需要多少量的水,按需去取。
同时现有的stream只能出一种水,之后倒到水桶之后你再选择加热还是制冷,新的stream2可以给这个水龙头加装加热、制冷装置,让他直接出热水或者冰水。
让楼上说完了。。。
不过新设计里,如果同样的数据 ,多个处理器感兴趣怎么办?
A读了n个字节,B只能读n之后的字节流了
除非继续用老的data侦听器咯