问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

node.js pipe是异步吗

发布网友 发布时间:2022-04-25 13:01

我来回答

2个回答

懂视网 时间:2022-05-15 22:20

这篇文章主要介绍了Node.js pipe实现源码解析,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

从前面两篇文章,我们了解到。想要把 Readable 的数据写到 Writable,就必须先手动的将数据读入内存,然后写入 Writable。换句话说,每次传递数据时,都需要写如下的模板代码


为了方便使用,Node.js 提供了 pipe() 方法,让我们可以优雅的传递数据


现在,就让我们来看看它是如何实现的吧

pipe

首先需要先调用 Readable 的 pipe() 方法


执行 pipe() 函数时,首先将 Writable 记录到 state.pipes 中,然后绑定相关事件,最后如果 Readable 不是 flow 模式,就调用 resume() 将 Readable 改为 flow 模式

传递数据

Readable 从数据源获取到数据后,触发 data 事件,执行 ondata()

ondata() 相关代码:


在 ondata(chunk) 函数内,通过 dest.write(chunk) 将数据写入 Writable

此时,在 _write() 内部可能会调用 src.push(chunk) 或使其 unpipe,这会导致 awaitDrain 多次增加,不能清零,Readable 卡住

当不能再向 Writable 写入数据时,Readable 会进入 pause 模式,直到所有的 drain 事件触发

触发 drain 事件,执行 ondrain()


每个 drain 事件触发时,都会减少 awaitDrain,直到 awaitDrain 为 0。此时,调用 flow(src),使 Readable 进入 flow 模式

到这里,整个数据传递循环已经建立,数据会顺着循环源源不断的流入 Writable,直到所有数据写入完成

unpipe

不管写入过程中是否出现错误,最后都会执行 unpipe()


Readable.prototype.unpipe() 函数会根据 state.pipes 属性和 dest 参数,选择执行策略。最后会触发 dest 的 unpipe 事件

unpipe 事件触发后,调用 onunpipe(),清理相关数据


End

在整个 pipe 的过程中,Readable 是主动方 ( 负责整个 pipe 过程:包括数据传递、unpipe 与异常处理 ),Writable 是被动方 ( 只需要触发 drain 事件 )

总结一下 pipe 的过程:

  • 首先执行 readbable.pipe(writable),将 readable 与 writable 对接上

  • 当 readable 中有数据时,readable.emit('data'),将数据写入 writable

  • 如果 writable.write(chunk) 返回 false,则进入 pause 模式,等待 drain 事件触发

  • drain 事件全部触发后,再次进入 flow 模式,写入数据

  • 不管数据写入完成或发生中断,最后都会调用 unpipe()

  • unpipe() 调用 Readable.prototype.unpipe(),触发 dest 的 unpipe 事件,清理相关数据

  • 热心网友 时间:2022-05-15 19:28

    实际上,每秒几乎有数千条 tweets 达到,数据库不可能及时处理高峰时段需要的写入数量。Node成为这个问题的解决方案的重要一环。如您所见,Node能处理数万条入站tweets。它能迅速轻松地将它们写入一个内存排队机制(例如 memcached)
    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    糖代谢增高会发展成糖尿病吗? 地毯怎么选购呢 酒店地毯定制 葡萄籽油可以炒菜吗 葡萄籽食用油炒菜好吃吗 ...道路的理论基础、时代背景、历史依据、现实依据 排骨怎么炖好吃又简单家常做法 家常炖排骨怎样做好吃 vivox9spius怎么设置指纹解锁屏幕呀求大神交 vivox9pius怎么解锁密码 手机,没了你会更好作文 关于静字的组词 本科毕业论文电子版学校保留几年,有相应条例么? 自考本科纸质的毕业论文在学校里存放几年? 带有“静”字的词语有哪些? 本科毕业论文保存几年 静字的由来和最初的含义 在word2010中做题:在文本最前面插入类别为“文本信息”,名称为“新闻提... 毕业论文写完了存放在哪里? 怎么让word始终显示在最上层? 历届本科毕业论文都存放在什么地方 怎样将word一直保持在最前面 公务员报考需要准备哪些材料? 2018年公务员联考网上报名如何操作呢? 2014年公务员联考报名条件 2014年公务员招聘联考报名条件有哪些? 您好,我想问一下 2020江西公务员考试报名条件是什么 2020河北公务员考试报名条件是什么呀? 2019省公务员考试报名条件 七夕节和谁过呢? 老婆突然问今天是什么节怎么回答才有情调 怎样把word文档置于最前(在打开网页的情况下) 带有静字的词语 毕业论文,是学校保留的吗?一般要保留多久? 有关静字的成语大全 Node.js-nodejs可否读取远程文件到本地 有没有像php file 请问研究生毕业论文各高校会保存几年? node.js怎么往文本文档中写入数据 带有“静”字的成语有哪些? word高手 !!来啊!怎样让 word的窗口总是在桌面的最前? 女朋友最近有事忙不来,叫我弄一篇毕业论文,我没有优盘,昨天去网吧写... 如何从字符串中的Node.js创建流 写出四个带有“静”字的词语 毕业论文只能在一个电脑上写保存吗 推荐四个带有“静”字的词语。 使用node.js,实现一个简单的接口服务器的功能 毕业之后自己还需要存着毕业论文的相关资料吗? 带静字的词语 河南师范大学的毕业论文真的保存到光盘里了吗?保存多久呀? 深入浅出Node.js的内容简介 关于静的四字词语。