process.stdin流的可读事件和数据事件有什么区别?

44

假设我有

process.stdin.setEncoding('utf8');
var myString = '';

什么是它们之间的区别?

process.stdin.on('readable', function() {
  myString += process.stdin.read();
});

process.stdin.on('data', function(chunk) {
  myString += chunk;
});

当标准输入结束时,如果输入字符串相同,则它们会给我相同的myString。

每个最佳实践是什么?谢谢。

1个回答

61
它们是两个不同的API,允许您访问相同数据块流。 'readable' API作为"Streams 2"的一部分在Node 0.10.0中引入,因此如果您搜索它,应该会有所帮助。问题的核心是'readable'接口允许更简单地管理和缓冲数据。
'data'示例调用您的函数并提供一个块,您别无选择,只能处理它,否则它将永远丢失。在'readable'示例中,函数告诉您数据可用,但您随时都可以读取它。这使底层系统知道您是否已处理了数据,因此非常容易支持称为“backpressure”的概念。
例如,在网络流中,如果客户端通过TCP连接向服务器发送数据,并且服务器非常忙碌,则会收到'readable'事件,但它可以选择等待读取数据,直到实际拥有处理数据的资源。通过不读取数据,流将对其进行缓冲,并且当该缓冲区接近最大大小时,流将停止从操作系统读取数据包,以避免占用过多RAM。然后,操作系统将开始丢弃数据包,并且由于已丢弃数据包,正在发送数据的客户端将减少发送数据的速度,以尝试减少数据包丢失。
这在旧版流“V1”实现中理论上都得到了支持,但更难做到。
因此,如果您预计有大量数据,则使用'readable'或设计流以进行传输是一个非常好的主意,但如果您只是从终端读取少量数据,则很可能不会看到任何区别。

这正是我需要知道的,谢谢! - Etienne Martin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接