什么流读取MultipartFile_深入理解并运用Node中的IO模型流

6df40a412118fe518720c096870356f6.png

在 NodeJs 中,流随处可见,读/写文件流,HTTP请求/返回流,stdin/stdout流。理解并运用好流会让你的Node更具力量。

Stream

  • lib/_stream_readable.js
  • lib/_stream_writable.js
  • lib/_stream_tranform.js
  • lib/_stream_duplex.js

流主要有可读 Readable,可写流 Writable,双工可读可写流 Duplex, Transform 流就是继承 Duplex 的。
通过pipe管道,可读流可以pipe到一个或多个可写流。
看源码能发现里面涉及了一堆状态控制的代码,什么时候读,什么时候写,什么时候暂停读。
大部分情况下程序面对的问题。通常都可以抽象成一个输入/输出的问题,中间可能会包含转换。

实际问题怎么运用流呢。

读取大文件

小文件可以一次性读到内存,但如果一个 10G 的文件呢?ReadLine 模块很好用但是你知道背后怎么实现的吗。
试试怎么用 stream.Transform 来自己实现一个readLine

const 

通过实现一个消费/可写流我们就可以来对大文件进行处理,比如说实现一个 word count 计数器, 从文件导入到数据库。

而不用担心需要一次性读取整个文件到内存里out of memory这种问题。

通过继承 strean 模块我们也不需要过多的去考虑什么时候该读,什么时候因为写的压力大(背压),该停止读,让整个读写流有序的运行。
你只需要专注于实现你自己的 write read transform
Spark, Strom 的实时计算流也是这样的,大任务分解成小任务,只需要专注于自己业务逻辑的 map,reduce

单机爬虫

再举个栗子, 它的输入可能是一堆 URL、输出是结构化的数据。需要写入到关系型数据库。

  • 可以把 URL 数据获取抽象成一个可读流,
  • 爬取过程,数据提取抽象成一个 transform 流
  • 写入数据库抽象成一个可写流,

只需要约定好每个过程输出的数据模型,就可以在每个过程实现各种目的不一样的流。

  • 如数据源,可以是读取文件,MYQL,分布式列队
  • 抓取转换流,可以是普通的 HTTP爬虫,Puppeteer 可渲染性爬虫
  • 数据存储流,可以写文件,MYQL,或者HDFS

read > transform > write

这样程序看起来是不是特别简洁?

URL 读取流

const 

把 URL 的变成结构化数据的转换流

const 

mysql 入库写入流

// mysql表模型

是不是简洁明了?
在Node中异步流随处可见,谁让它基因就是这样呢。

参考:

  • https://nodejs.org/api/stream.html
  • https://www.barretlee.com/blog/2017/06/06/dive-to-nodejs-at-stream-module/
  • https://nodejs.org/en/docs/guides/backpressuring-in-streams/

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

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

相关文章

C 线程的创建

前言线程创建很容易,直接调用std::thread,就创建一个新线程了。该线程拿到任务后立即开始执行。线程的创建者(父线程)必须管理创建的线程(子线程),应该等到子线程完成其任务或者让子线程从自己身…

apache karaf_未来是Apache Karaf上的微服务架构

apache karaf这是Jamie Goodyear的客座博客文章( 博客 , icbts )。 他是Savoir Technologies的开源倡导者,Apache开发人员和计算机系统分析师; 他为全球大型组织设计,批判和支持了体系结构。 他拥有纽芬兰…

AppScan api登录接口 postman_如何通过Postman调用EDI系统的API?

知行EDI系统主要是用来实现贸易双方的数据交换的过程,这个过程中,贸易双方往往需要根据国际通用的消息格式收发信息,我们称符合国际规范的消息文件为EDI报文,然而不同的公司会结合ERP的接口情况选择不同的集成方式,例如…

指针函数和函数指针

概述指针函数和函数指针是C语言里两个比较绕的概念。但是不仅面试题爱考,实际应用中也比较广泛。很多人因为搞不清这两个概念,干脆就避而远之,我刚接触C语言的时候对这两个概念也比较模糊,特别是当指针函数、函数指针、函数指针变…

android显示绘图动画,Android自定义View绘图实现渐隐动画

实现了一个有趣的小东西:使用自定义view绘图,一边画线,画出的线条渐渐变淡,直到消失。效果如下图所示:用属性动画或者渐变填充(shader)可以做到一笔一笔的变化,但要想一笔渐变(手指不抬起边画边渐隐)&#…

python网络编程项目_python网络编程详解

最近在看《UNIX网络编程 卷1》和《FREEBSD操作系统设计与实现》这两本书,我重点关注了TCP协议相关的内容,结合自己后台开发的经验,写下这篇文章,一方面是为了帮助有需要的人,更重要的是方便自己整理思路,加…

分享10个值得关注的C语言开源项目

来源于网络,如有侵权,告知必删。

python3 x默认使用的编码_python3默认使用什么编码

python3默认编码为unicode,由str类型进行表示。二进制数据使用byte类型表示。 字符串通过编码转换成字节码,字节码通过解码成为字符串encode:str --> bytes(推荐学习:Python视频教程) decode&#xff1a…

html中写css代码,开发DIV CSS时 先写CSS代码还是先写HTML代码

相信良多LOVE用DIVCSS技术启示重构网页的爱好者友好,在起源学习DIVCSS的时分都邑想一个标题,想晓得DIVCSS妙手或有教育者在开发制作html页面的时刻,下场是先写html照样先写css?带着这…

象棋子 设计模式_通过设计国际象棋游戏了解策略模式

象棋子 设计模式今天,我们将借助一个示例来尝试了解策略模式。 我们将考虑的示例是国际象棋游戏。 这里的目的是解释策略模式,而不是构建全面的国际象棋游戏解决方案。 策略模式:策略模式被称为行为模式–用于管理对象之间的算法&#xff0…

入门C语言10问10答

1 如何理解变量与常量?变量与常量相当于数据的可读可写与只读,常量是数据的一种保护机制。在内存分配给程序的内存块中有专门的常量(只读)存储区。2 整型数据的溢出问题任何一种数据类型的数据在计算机中都有它确定的数值表示范围&#xff0…

mac json格式化工具_简洁好用的工具都是相似的

大家好,我是你们的章鱼猫。不知道大家了不了解 jq 这个工具呢?指的不是 JQuery,而是一个命令行工具。jq 是一个轻量级而且灵活的命令行 JSON 解析器,类似用于 JSON 数据的 sed 工具。我们来看一下使用 jq 处理 json 的基本用法(更…

战神4 幕后花絮 概念艺术_Java 9幕后花絮:新功能从何而来?

战神4 幕后花絮 概念艺术找出Java幕后发生的事情,以及新功能如何实现 在上一篇文章中,我们介绍了即将发布的Java 9版本的新功能和尚待解决的功能,并简要提到了将新功能添加到下一个版本之前要经历的过程。 由于此过程几乎影响了所有Java开发人…

ID生成器 雪花算法

背景:在很多业务场景下,我们都需要一个唯一的 ID 来进行一些数据的交互,那么如何生成这个唯一的 ID 呢?如果在单机的情况下,生成唯一ID,可以利用机器内存的特点,通过内存分配即可。但我们线上的…

python anaconda安装_Python - 安装并配置Anaconda环境

$ py --version # 当前默认python版本 Python 3.7.1 $ conda create --name testpy2 python2.7 pandas # 创建名为testpy2的运行环境,并安装pandas包及其依赖包 Solving environment: done ## Package Plan ## environment location: D:\DownLoadFiles\anaconda3\en…

jstack调试_增压的jstack:如何以100mph的速度调试服务器

jstack调试使用jstack调试实时Java生产服务器的指南 jstack就像U2一样-从时间的黎明就一直在我们身边,我们似乎无法摆脱它 。 除了笑话,到目前为止,jstack是您的工具库中用于调试实时生产服务器的最方便的工具之一。 即便如此,我仍…

C/C 输入输出缓冲区

【导读】:本文介绍C与C 输入输出缓冲的一些操作与特性。以下是正文(1)c 中cin、cout,cerr和c的stdin、stdout、stderr都是同步的,即iostream 对象和 and cstdio流是同步的,同步关系如下:同步即表…

python输入input数组_python怎么输入数组

python怎么输入数组? python输入数组 一维数组:arr input("") //输入一个一维数组,每个数之间使空格隔开 num [int(n) for n in arr.split()] //将输入每个数以空格键隔开做成数组 print(num) //打印数组 一维数组输入输出示例&a…

eclipse 扩展_Eclipse扩展的轻量级集成测试

eclipse 扩展最近,我为Eclipse扩展点评估引入了一个小助手。 辅助程序努力减少通用编程步骤的样板代码,同时增加开发指导和可读性。 这篇文章是希望的后续文章,它显示了如何将实用程序与AssertJ定制断言结合使用,以编写针对Eclip…

深入理解右值引用,move语义和完美转发

move语义最原始的左值和右值定义可以追溯到C语言时代,左值是可以出现在赋值符的左边和右边,然而右值只能出现在赋值符的右边。在C 里,这种方法作为初步判断左值或右值还是可以的,但不只是那么准确了。你要说C 中的右值到底是什么&…