Node核心模块之Stream

news2024/9/20 18:45:51

Node.js诞生之初就是为了提高IO性能,文件操作系统和网络模块实现了流接口,Node.js中流就是处理流式数据的抽象接口。

那么应用程序为什么使用流来处理数据?

在这里插入图片描述

常见问题

  • 同步读取资源文件,用户需要等待数据读取完成
  • 资源文件最终一次性加载至内存,开销较大
    在这里插入图片描述
    在这里插入图片描述

流处理数据的优势

  • 时间效率: 流的分段处理可以同时操作对个数据chunk
  • 空间效率: 同一时间流无序占据大内存空间
  • 使用方便: 流配合管理,扩展程序变得简单

Node.js中流的分类

  • Readable: 可读流,能够实现数据的读取
  • Writeeale: 可写流,能够实现数据的写操作
  • Duplex:双工流,季可读又可写
  • Tranform:转换流,可读可写,还能实现数据转换

Node.js流特点

  • Sream 模块实现了四个具体的抽象
  • 所有流都继承自EventEmitter

可读流

生产供程序消费数据的流,如何自定义可读流?

自定义可读流

  • 继承stream里的Readable
  • 重写_read方法调用push产出数据

自定义可读流的问题

  • 底层数据读取完成之后如何处理?
  • 消费者如何获取可读流中的数据?

消费数据为什么存在两种方式

  • 流动模式
  • 暂停模式
    在这里插入图片描述

消费数据

  • readable事件:当流中存在可读取数据时触发
  • data事件: 当流中数据块传给消费者后触发

可读流总结

  • 明确数据产生与消费流程
  • 利用API实现自定义可读流
  • 明确数据消费的事件使用

可写流

用于消费数据的流

自定义可写流

  • 继承stream模块的Writeable
  • 重写_write方法,调用write执行写入

可写流事件

  • pipe事件:可读流调用pipe()方法时触发
  • unpipe事件:可读流调用unpipe()方法时触发
  • drain事件:write返回false,数据可执行写入时触发

Duple &&Transform

Node.js中stream是流操作的抽象接口集合,可读、可写、双攻、转换是单一抽象的具体实现。流操作的核心功能就是处理数据。Node.js诞生之初就是解决密集型IO事务。Node.js中处理数据模块继承了流和EventEmitter
stream、四种类型流、实现流操作的模块
Duplex是双工流,技能生成又能消费

自定义双工流

  • 继承Duplex类
  • 重写_read方法,调用push生产数据
  • 重写_write方法,调用write消费数据
  • Transform也是一个双工流

自定义转换流

  • 继承Transform类
  • 重写_transform类,调用push和callback
  • 重写_flush方法,处理剩余数据

Node.js中的四种流

  • Readable可读流
    • 继承Readable与EventEmitter
  • Writeable可写流
  • Duplex双工流
  • Transform转换流
  • drain与写入速度

背压机制

Node.js的stream已实现了背压机制
数据读写时可能存在的问题
内存溢出、GC频繁调用、其它进程变慢
在这里插入图片描述
在这里插入图片描述

模拟文件可读流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/31143.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Windows】windows10时间显示秒数

一般情况下windows10的电脑时间只显示小时和分钟,但是有的用户想要时间显示更加精细,那么windows10时间怎么显示秒呢?大家可以通过修改注册表的方式进行设置:打开注册表编辑器,定位到Advanced,右键新建DWOR…

【第十四篇】Camunda系列-多人会签【多实例】

多人会签 Multiple Instance 也叫多实例任务。 1.会签说明 多实例活动是为业务流程中的某个步骤定义重复的一种方式。在编程概念中,多实例与 for each 结构相匹配:它允许对给定集合中的每个项目按顺序或并行地执行某个步骤或甚至一个完整的子流程。 多实例是一个有额外属性…

注解(Annotation)

注解 注解也被称为元数据(MateDate),用于修饰或解释包,类,方法,属性,构造器,局部变量等数据信息和注释一样,注解不会影响程序逻辑,但是注解可以被编译或者运行&#xff…

如何定义需求优先级?

本文将围绕以下问题展开:1、什么是需求优先级排序,目的是什么?2、优先级排序的8大依据;3、需求优先级排序面临的挑战;4、一些优秀的需求优先级排序工具。 一、什么是需求优先级排序,目的是什么?…

Mybatis-plus 用法

本文主要介绍 mybatis-plus 这款插件,针对 springboot 用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。 关于 mybatis-plus 是什么,不多做介绍了,看…

大一作业HTML网页作业:简单的旅游 1页 (旅游主题)

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材,DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 游景点介绍 | 旅游风景区 | 家乡介绍 | 等网站的设计与制作 | HTML期末大学生网页设计作业,Web大学生网页 HTML:结构 CSS&…

94-98-Hadoop-MapReduce工作流程(重要)

Hadoop-MapReduce工作流程(重要): 上面的流程是整个 MapReduce 最全工作流程,但是 Shuffle 过程只是从第 7 步开始到第 16 步结束,具体 Shuffle 过程详解,如下: (1)Map…

Java 动态判断数组维数并取值

一、背景 技术交流群里有同学提了一个看似基础但挺有意思的问题。 问题描述: 一个对象是一个未知的数组类型,可能是 short 二维数组,可能是 int 的三维数组等。 诉求: 想要遍历修改(获取)它的值不想写太多…

springboot 接入 logback.xml 彻底搞出一个超级完整加注释的版本-可在生产环境直接使用

目录 介绍 开搞 先logback.xml相关的 pom.xml application.yml 配置 启动配置 类中编写 引入 Slf4j logback.xml 重点介绍 logback项目名称 最大保存时间 365天 lOGGER PATTERN 根据个人喜好选择匹配 控制台输出 滚动文件 过滤器 可以选择自己要的日志级别 不选…

【机器学习数据集制作】视频转图片(代码注释,思路推导)

目录数据集效果资源下载实现思路代码实战总结『机器学习』分享机器学习0基础的数据集制作过程。 欢迎关注 『机器学习』 系列,持续更新中 欢迎关注 『机器学习』 系列,持续更新中 数据集效果 资源下载 拿来即用,所见即所得。 项目仓库&#…

​LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件

​LabVIEW从另一个VI或通过VI服务器访问正在运行的可执行文件 有没有办法从另一个VI或可执行文件访问正在运行的LabVIEW可执行文件。例如,从显示控件获取值,为控件设置值,以及初始化运行LabVIEW可执行文件VI的前面板。 在正在运行的可执行文…

IOS逆向初探

前言 这些文章用于记录学习路上的点点滴滴,也希望能给到刚入门的小伙伴们一点帮助。爱而所向,不负所心。 环境 iphone 6 MacOS Monterey 12.3.1 一、IOS开发语言 Objective-C Objective-C是iOS操作系统运用的软件开发语言。Objective-C的流行完全是因…

免费下载word简历模板的网站

我这里分享了6个免费简历网站,分享给各位。 1.OfficePlus 微软官方出品的 office 免费模板网站https://www.officeplus.cn/ 2.简历设计网 2000Word模板免费下载,每个用于每天可下载10篇免费模板。https://www.jianlisheji.com/ 3.办公资源…

mysql 一对多查询 合并为一行数据

用户包含多个角色 执行: SELECT ur.user_id,u.name user_name,u.mail,ur.role_id,r.name role_name FROM tb_user_role ur LEFT JOIN tb_user u ON u.idur.user_id LEFT JOIN tb_role r ON r.idur.role_id WHERE u.is_delete0 ORDER BY …

华为大数据HCIA题目1

1. HDFS 不适用于以下哪些场景?[多选题] A.流式数据访问 B.大量小文件存储 C.大文件存储与访问 D.随机写入 (BD) 2. ZKFC 进程部署在 hdfs 中的以下那个节点上?[多选题] A.active namenode B.standby namenode C.datanod…

重塑运维系统,跨越烟囱式建设的陷阱

企业运维系统建设经过多年演变,从以商业软件为主,到开源软件的百花齐放,极大的降低了成本,但是在建设过程中,却非常容易落入到烟囱式建设的陷阱,因此如何跨越它,成为了众多企业面临的难题。 今…

Deepin Linux系统怎安装打印机? 兄弟1618w打印机驱动安装图文教程

Deepin系统作为国产的一款电脑操作系统,拥有极为非常美观的UI界面。很多不熟悉该操作系统的朋友都不知道该怎么安装打印机驱动,今天我们就以兄弟1618w打印机为例,分享驱动下载,安装,调试的过程。 电脑环境和打印机型号…

Design Compiler工具学习笔记(5)

目录 引言 知识储备 代码风格 DFT 实际操作 引言 本篇继续学习 DC的基本使用。本篇主要学习 DC 工作机理和工作过程 以及简单介绍 DFT。 前文链接: Design Compiler工具学习笔记(1) Design Compiler工具学习笔记(2&#…

动态规划算法学习四:最大上升子序列问题(LIS:Longest Increasing Subsequence)

文章目录前言一、问题描述二、DP步骤1、最优子结构a、限界上升子序列b、最优子结构性质2、状态表示和递推方程3、计算最优值4、算法实现三、优化:非DP /二分法1、新问题2、算法实现前言 一、问题描述 二、DP步骤 1、最优子结构 给定序列𝑆[&#x1d4…

“300万”只是新起点,比亚迪将开启下一个 “黄金周期”

比亚迪再次创造全球新能源汽车市场新标杆。 11月16日,比亚迪第300万辆新能源汽车正式下线。成为首个达成这一里程碑的中国品牌。 正如比亚迪股份有限公司董事长兼总裁王传福说,从“第1辆新能源汽车到第100万辆新能源汽车”用时13年、从“100万辆到200万…