日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

stream pipe的原理及简化源码分析

發(fā)布時間:2023/12/31 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 stream pipe的原理及简化源码分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

在編寫代碼時,我們應(yīng)該有一些方法將程序像連接水管一樣連接起來 -- 當(dāng)我們需要獲取一些數(shù)據(jù)時,可以去通過"擰"其他的部分來達(dá)到目的。這也應(yīng)該是IO應(yīng)有的方式。 -- Doug McIlroy. October 11, 1964

本質(zhì)上來說,編碼就是對數(shù)據(jù)的讀取,處理最后返回結(jié)果,數(shù)據(jù)在一個程序又一個程序中不斷傳遞。理想情況下,數(shù)據(jù)的傳遞應(yīng)該是不停滯的,但是現(xiàn)實情況中因為諸如單個數(shù)據(jù)過大,內(nèi)存較小,IO處理較慢等客觀原因使數(shù)據(jù)不能流暢的流動起來。這時我們就需要一種方法去將數(shù)據(jù)拆分成一小塊一小塊的數(shù)據(jù)(chunks),流水一樣的讀取處理寫入。這種方法便是流(stream),nodejs中的流主要分為以下四種:

  • Readable(可讀流)
  • Writable(可寫流)
  • Duplex(可讀寫流)
  • Transform (變換流)

而所有的流都有一種公有方法,它會像管道一樣處理流的數(shù)據(jù),這便是pipe,下面一張大神制作的圖很好的演示了這個過程:

#正文

pipe期望的使用方式

pipe函數(shù)需要將源頭src并將數(shù)據(jù)輸出到一個可寫的流dst中:

src.pipe(dst) 復(fù)制代碼

pipe將會返回dst,所以我們希望可以鏈?zhǔn)秸{(diào)用將多個流用管道連接起來:

a.pipe(b).pipe(c).pipe(d) 復(fù)制代碼

pipe的簡化源碼分析

為了實現(xiàn)以上期望的使用方式,我們將Nodejs源碼簡化一下看是怎樣實現(xiàn)的

stream.prototype.pipe = function(dest, options) {this.on('data', (chunk) => {if (dest.writable) {if (false === dest.write(chunk) && this.pause) {this.pause();}}});dest.on('drain', () => {this.resume();});dest.emit('pipe', this);return dest; }; 復(fù)制代碼

以上代碼主要做了4件事:

  • 可讀流監(jiān)聽data事件 1)首先判斷dest.Writable,當(dāng)寫完時會賦值為false 2)此時如果消費者消費速度慢,這時產(chǎn)生了一個現(xiàn)象,叫做背壓。背壓問題即是外部的生產(chǎn)者和消費者速度差造成的,此時我們需要暫停寫入.pause()
  • 可寫流監(jiān)聽drain事件 1)消費者完成消費,可以觸發(fā)drain事件,此時我們可以繼續(xù)向流中寫入數(shù)據(jù)。執(zhí)行.resume()
  • 觸發(fā)pipe事件,通知有流寫入
  • 返回dest流,可以進(jìn)行鏈?zhǔn)秸{(diào)用

小記

簡單的梳理了下stream pipe的原理和實現(xiàn)方式。在現(xiàn)實應(yīng)用中諸如gulp,Browserify等工作流工具都使用了pipe。而stream更是應(yīng)用廣泛,文件、http、打包壓縮甚至console等都是用流實現(xiàn)的。

參考資料
  • gulp源碼解析(一)—— Stream詳解
  • stream-handbook

總結(jié)

以上是生活随笔為你收集整理的stream pipe的原理及简化源码分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。