nodejs 的 stream 有四種:
// _read方法是從底層系統讀取具體資料的邏輯,即生產資料的邏輯。
// 在_read方法中,通過呼叫push(data)將資料放入可讀流中供下游消耗。
// 在_read方法中,可以同步呼叫push(data),也可以非同步呼叫。
// 當全部資料都生產出來後,必須呼叫push(null)來結束可讀流。
// 流一旦結束,便不能再呼叫push(data)新增資料。
// 建立乙個可以讀的流,通過這個流物件監聽資料
const stream = require('stream');
const readable = stream.readable;
class myfilereader extends readable
attachdatasource(datasource)
// 實現 _read 方法
_read()
}class datasource
// 生產資料
fill()
} // 獲取資料
get()
return this.data.pop();
}}const datasource = new datasource();
const myfilereader = new myfilereader();
myfilereader.attachdatasource(datasource);
myfilereader.on('data', (data) => console.log('data: ' + data));
myfilereader.on('end', () => console.log('end'));
在 _read 方法裡,可以呼叫 push 方法往緩衝池裡放入資料,這裡寫的this.push(this.datasource.get())
方法是乙個同步方法,獲取完資料後立馬再次執行 _read 方法獲取下一條資料,如果你在_read 方法裡寫乙個非同步push 的資料
settimeout(() => );
那麼本次 _read 方法執行後,沒有資料則不會執行下一次 _read 方法,直到 state 發生了變化,具體的細節可以參看: 這篇文章
// 上游通過呼叫writable.write(data)將資料寫入可寫流中。write()方法會呼叫_write()將data寫入底層。
// 在_write中,當資料成功寫入底層後,必須呼叫next(err)告訴流開始處理下乙個資料。
// next的呼叫既可以是同步的,也可以是非同步的。
// 上游必須呼叫writable.end(data)來結束可寫流,data是可選的。此後,不能再呼叫write新增資料。
// 在end方法呼叫後,當所有底層的寫操作均完成時,會觸發finish事件。
const writable = require('stream').writable
class towritable extends writable
_write(data, enc, next)
}const writable = new towritable();
writable.on('finish', () => process.stdout.write('done'));
// 將乙個資料寫入流中
writable.write(`a\n`);
writable.write(`b\n`);
writable.write(`c\n`);
// 再無資料寫入流時,需要呼叫`end`方法
writable.end();
// **中實現了_read方法,所以可以監聽data事件來消耗duplex產生的資料。
// 同時,又實現了_write方法,可作為下游去消耗資料。
const duplex = require('stream').duplex
class toduplexable extends duplex
_write(buf, enc, next)
_read()
// this.push(this.index++)
}}const toduplexable = new toduplexable();
toduplexable.on('data', data => process.stdout.write(data));
toduplexable.on('end', () => process.stdout.write('done'));
toduplexable.write('');
settimeout(() => , 1000);
// duplex 可讀流中的資料(0, 1)與可寫流中的資料('a', 'b')是隔離開的,但在transform中可寫端寫入的資料經變換後會自動新增到可讀端
//tranform繼承自duplex,並已經實現了_read和_write方法,同時要求使用者實現乙個_transform方法。
const transform = require('stream').transform
class mytransform extends transform
_transform(buf, enc, next)_transform\n`);
// 呼叫next方法準備處理下乙個
next();
}}var mytransform = new mytransform();
mytransform.on('data', data => process.stdout.write(data));
mytransform.write('abc');
mytransform.write('def');
mytransform.end();
Android tensorflow 基礎知識學習
今天記錄下tensorflow的一些基本知識 1.匯入tensorflow 庫,且指令碼中新增執行使用的python環境 user bin env python import tensorflow as tf 匯入tensorflow庫 匯入 mnist 資料集 資料在linux 根目錄 data下...
Hyperledger Fabric 基礎知識筆記
區塊鏈可以幫助在競爭者之間或具有相反商業利益的組織之間建立信任,這可能導致爭執。資產在hyperledger fabric中表示為鍵值對的集合,狀態更改記錄為通道 分類賬中的事務。資產可以二進位制和 或json形式表示。chaincode是定義一項或多項資產的軟體,以及用於修改資產的交易指令 換句話...
Hyperledger Fabric基礎知識摘記
fabric是hyperledger專案的乙個子專案,它實現了區塊鏈技術,是一種基於交易呼叫和數字事件的分布式共享賬本技術。它採用模組化的架構設計,支援可插拔的元件開發和使用。fabric引入了成員管理的服務,即每個參與者都需要得到對應的證書證明身份才能夠訪問fabric系統,同時引入了多通道的概念...