ホームページ >ウェブフロントエンド >jsチュートリアル >ノード内のストリームの詳細な分析
ストリームとは何ですか?流れをどう理解するか?次の記事では、Nodejs のストリームについて詳しく説明します。お役に立てば幸いです。
stream は、EventEmitter を継承する抽象データ インターフェイスです。データを送受信できます。その本質は、以下に示すようにデータをフローさせることです。 ##Stream は Node 独自の概念ではなく、オペレーティング システムの最も基本的な操作方法です。Linux では | Stream ですが、Node レベルでカプセル化され、対応する API
# を提供します##なぜ少しずつ行う必要があるのでしょうか?
curl http://127.0.0.1:8000リクエストを行うと、メモリは約 420MB になり、作成したファイルとほぼ同じサイズになります
最終結果
データが転送されると、データ イベントがトリガーされ、処理のためにこのデータを受信し、最後にすべてのデータが転送されるまで待機します。 . 終了イベントをトリガーします。 データ フロー プロセス
データの出所 - ソース
データはある場所から別の場所に流れます。データのソースで。#file ファイルで、上記の例のようなファイルの内容を読み取ります。
どこへ行くか - dest
http リクエスト、インターフェース内のレスポンス request
file ファイル、write file
#? ファイルの読み取りストリームの作成
fs.createReadStream Readable オブジェクトの作成
Read モードおよび pause mode は、チャンク データのフロー モードを決定します: 自動フローと手動フロー FlowReadableStream には _readableState 属性があります。フロー モードを決定するフロー属性があり、3 つの状態値があります:
ture: フロー モードとして表現されます給湯器モデルを使用して、データ フローをシミュレートできます。給湯器のタンク(バッファキャッシュ領域)にはお湯(必要なデータ)が蓄えられており、蛇口を開くと給水タンクからはお湯が流れ続け、給水タンクには水道水が流れ続けます。フローモード。蛇口を閉めると水タンクへの水の流入が止まり、蛇口からの出水も一時停止する「一時停止モード」です。
フロー モード読み取り可能なストリームは作成後の初期状態です //TODO: オンライン共有と矛盾しています
- 监听 data 事件 - 调用 stream.resume 方法 - 调用 stream.pipe 方法将数据发送到 Writable
- 移除 data 事件 - 调用 stream.pause 方法 - 调用 stream.unpipe 移除管道目标
実装原則
read メソッドを呼び出すと、全体的なプロセスは次のようになります。
#doRead
キャッシュが維持されます。 stream 内で、最下層からのデータをリクエストする必要があるかどうかを判断するために read メソッドを呼び出すとき
バッファ長が 0 以下の場合、最下層からデータを取得するために _read が呼び出されますソース コードのリンク
Writable Stream はデータの書き込み先を抽象化したもので、上流から流れるデータを消費するために使用されます。書き込み可能なストリーム、データはデバイスに書き込まれます。一般的な書き込みストリームはローカル ディスクに書き込みます
ws.write( chunk) を呼び出すと false が返され、現在のバッファ データが highWaterMark の値以上であることを示し、ドレイン イベントがトリガーされます。実際、これは警告として機能します。データを書き込むことはできますが、未処理のデータは、バックログが Node.js バッファーでいっぱいになるまで、書き込み可能なストリームの 内部バッファー
に常にバックログされます。強制的に中断される可能性があります。
#writable.write メソッドを呼び出してストリームにデータを書き込むと、_write メソッドが呼び出されます。データを最下層に転送します。
クライアントは二重です。書き込み可能ストリームはサーバーへのメッセージの送信に使用され、読み取り可能ストリームはサーバー メッセージの受信に使用されます。2 つのストリームのデータ間には直接の関係はありませんTransform StreamTransform Stream
##less→less を css に変換→css 圧縮を実行→compressed css
実際には、 less() と minifyCss() は入力データに対して何らかの処理を実行し、それを出力データに渡します
Duplex と Transform の選択
上記の例と比較すると、ストリームがプロデューサーとコンシューマーの両方にサービスを提供する場合は Duplex を選択し、データに対して何らかの変換作業を行うだけの場合は Transform
バックプレッシャ問題は、コンシューマが速度を処理する生産者/消費者モデルに起因します。遅すぎる
たとえば、ダウンロード処理中の処理速度は3Mb/sですが、圧縮処理中の処理速度は1Mb/sです。この場合、すぐにバッファキューが蓄積されます
プロセス全体のメモリ消費量が増加するか、バッファ全体が遅くなり一部のデータが失われます
##圧縮処理でバッファデータの圧迫が閾値を超えた場合、ダウンロード処理に「宣言」します。忙しすぎます。再度送信しないでください。
メッセージを受信した後、ダウンロード処理で下方向へのデータの送信が一時停止されます。
対処方法バックプレッシャーWhen .pipe() はソースによって呼び出され、送信するデータがあることをコンシューマーに通知します。パイプライン関数は、イベント トリガーに適したバックログ パッケージを確立します。
データ キャッシュが highWaterMark を超えるか書き込みキューがビジーな場合、.write() は false を返します
false が返される場合、バックログ システム踏み込んだ。データを送信しているデータ ストリームからの受信 Readable を一時停止します。データ ストリームが空になると、ドレイン イベントがトリガーされ、受信データ ストリームが消費されます。
キューが完全に処理されると、バックログ メカニズムによりデータの再送信が可能になります。使用中のメモリ空間は自動的に解放され、データの次のバッチを受信する準備が整います
#パイプのバック プレッシャー処理が確認できます:
データをチャンクごとに分割して書き込みます
##チャンクが大きすぎる場合やキューがビジーな場合は読み取りを一時停止します以上がノード内のストリームの詳細な分析の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。