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

时间:2014-10-03 06:36:38

标签: javascript node.js stream buffer stdin

说我有

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

之间有什么区别
process.stdin.on('readable', function() {
  myString += process.stdin.read();
});

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

如果输入字符串在stdin结束时是相同的,那么它们会给我相同的myString

每种方法的最佳做法是什么?感谢

1 个答案:

答案 0 :(得分:42)

它们是两个不同的API,允许您访问相同的数据块流。 {1}} API作为“Streams 2”的一部分在Node 0.10.0中引入,因此如果您搜索它,它应该有所帮助。该问题的核心是'readable'接口允许更简单地管理和缓冲数据。

'readable'示例用一个块调用你的函数,你别无选择,只能处理它,否则它将永远丢失。在'data'示例中,该函数告诉您数据可用,但您可以随时阅读。这允许底层系统知道您是否已处理数据,因此支持名为 backpressure 的概念非常简单。

例如,在网络流中,如果客户端通过TCP连接向服务器发送数据并且服务器超级忙,它将收到'readable'个事件,但它可以选择等待读取数据,直到它实际上有资源来处理数据。通过不读取数据,流将缓冲它,并且当缓冲区接近最大大小时,流将停止从操作系统读取数据包以避免占用太多RAM。然后操作系统将开始丢弃数据包,并且由于数据包被丢弃,发送数据的客户端将降低发送数据的速度,以减少数据包丢失。

旧版流“V1”实现在技术上支持这一点,但要做得更难。

所以基本上,如果你期待大量数据,使用“可读”或设计你的流来管道是一个非常好的主意,但如果你只是从终端读取一些数据,那么你很可能会看到零差异。