NodeJs ReadStream機制分析

2021-07-16 01:42:08 字數 2243 閱讀 3844

讀了一下午源**,作者寫的**太難懂了,洋洋灑灑,勉強看懂。

readstream有兩個模式,即flow模式和readable模式,一旦設定成一種模式,最好不要切換成另一種。

flow模式採用好處是可以控制速度,常見用法為

readable.on("data",function(data));

}});readable.on("end",function());//do whatever you want

而readable模式則需要檢視read方法的返回值,read()返回null,整個讀取即告結束

readable.on("readable",function())

}readable.on("end",function());

其實還有乙個.pipe模式,這也是node官方推薦的,她就是幫我們把on('data')包了一層,然後加入了速度控制。

1.當乙個stream被呼叫了on("data",..)後,即進入flow模式。

2.stream.flow被設定成true,並且呼叫resume方法,下圖是resume方法的截圖

function resume(stream, state) 

}function resume_(stream, state)

state.resumescheduled = false;

stream.emit('resume');

flow(stream);

if (state.flowing && !state.reading) stream.read(0);

}

可以看到,最終boss是這個flow方法。

function flow(stream)  while (null !== chunk && state.flowing);

}}

3.flow模式會首先嘗試不斷呼叫read(),直至他返回null位置。一般情況下,非同步獲取資源,read()很容易在第一次就返回null。

我一開始的疑問是,這樣的話,整個流程不就結束了?

.但是,仔細思考一下那個就能明白,首先這裡的stream.read()是同步呼叫方式,這和stream的非同步有矛盾。但是通過讀read**可以發現,他會呼叫_read,而_read在讀取完資料會會呼叫push,push會把整個flow從新啟用起來。

4.還有一點,這裡read()方法的返回值,我們根本沒有**可以用啊。實際上,read()方法不僅返回讀取到的值,還會傳送"data"時間,下圖是read()方法的最後幾行。

if (ret !== null)

this.emit('data', ret);

return ret;

讓我們仔細看一下read方法的大致語義

read(n)

a.首先決定要從快取中讀多少資料, 如果當前傳入的n小於當前stream的buffer裡的值,就可以把快取中的那部分資料給取出來。那麼就讀取n個位元組。

如果不傳引數,那麼直接把buffer裡所有的全部都拿出來。讀取的位元組數=現在快取裡有的,n=buffer.length

如果傳入的引數》當前buffer的大小,此次read失效,不讀取,n=0。

決定完後這個數值假設它是n。

b.決定完n後,看看當前buffer.length-n之後是否大於等於highwatermark。如果是的話,就沒必要從resource(可能是硬碟,可能是網路)上讀取新的東西了,直接用buffe裡就足夠了,反正後續的read()方法也會消耗buffer。

c. 如果buffer.length-n < highwatermark 的話,那麼這時候就要呼叫_read方法,從resource上讀東西了,這個過程是非同步的。

5.一般_read方法要求我們把資料讀完後呼叫push方法,這個方法大致實現如下。可以看到,他會新資料push到buffer裡,還會傳送readable時間,然後通過flow方法把整個flow重新啟用。

state.length += state.objectmode ? 1 : chunk.length;

if (addtofront)

state.buffer.unshift(chunk);

else

state.buffer.push(chunk);

if (state.needreadable);

差分隱私學習三 實現機制

在實踐中,通常使用拉普拉斯機制和指數機制來實現差分隱私。拉普拉斯機制用於數值型結果的保護,指數機制用於離散型結果的保護。拉普拉斯機制通過向確切的查詢結果中加入服從拉普拉斯分布的隨機雜訊,來實現 差分隱私保護 記位置引數為0 尺度引數為b的拉普拉斯分布為lap b 那麼其概率密度函式為 p x exp...

php自動載入autoload機制示例分享

1,自定義函式 2,spl autoload register 複製 如下 liuyuan ebuinfo var www phpgcs php autoload ll rw rw r 1 liuyuan liuyuan 800 feb 19 11 39 func autoload.php rw r...

vlc內部執行機制以及架構分

vlc 架構剖析 1.videolan簡介 1.1 videolan組成 videolan有以下兩部分組成 vls 是一種流伺服器,專門用來解決流的各種問題,它也具有一些vlc的特徵。videolan作 為伺服器可以輸出http,rtp,rtsp的流。1.2 vlc優點 下圖表示出了videolan...