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

Posted

技术标签:

【中文标题】process.stdin 流的可读事件和数据事件有啥区别?【英文标题】:What are the differences between readable and data event of process.stdin stream?process.stdin 流的可读事件和数据事件有什么区别? 【发布时间】:2014-11-28 05:42:59 【问题描述】:

说我有

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】:

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

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

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

旧的流“V1”实现在技术上都支持这一切,但要做到这一点要困难得多。

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

【讨论】:

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

以上是关于process.stdin 流的可读事件和数据事件有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS 难点(网络,文件)的 核心 stream 三:readable ?

Kafka - 带有批处理数据和流的事件之间的区别

_read() 未在可读流上实现

将数据管道传输到尚未准备好接收数据的可写流

为啥 data 事件只会阻止 NodeJS 运行时退出?

整理之DOM事件阶段冒泡与捕获事件委托ie事件和dom模型事件鼠标事件