ホームページ ウェブフロントエンド jsチュートリアル Node.js_node.js のストリームの概要

Node.js_node.js のストリームの概要

May 16, 2016 pm 04:07 PM
node.js stream 流れ

フローとは何ですか?

ストリームと言えば、*nix の概念が含まれます。 Pipe - *nix では、ストリームは (パイプ文字) を介してブリッジできるデータとしてシェルに実装されます。プロセス (stdout) は、次のプロセスの入力 (stdin) として直接使用できます。

Node では、ストリーム (Stream) の概念が似ており、データ ストリームのブリッジ機能を表します。

パイプ

ストリーミングの本質は .pipe() メソッドにあります。ブリッジ機能は、データ ストリームの両端 (アップストリーム/ダウンストリーム、または読み取り/書き込みストリーム) が .pipe() メソッドでブリッジされることです。

擬似コードの表現形式は次のとおりです:

コードをコピー コードは次のとおりです:

//上流.pipe (下流)
Readable.pipe(Writable);

ストリームの分類

これは、Node v0.4 より前のいわゆる「クラシック」フローについて説明することを目的としたものではありません。次に、ストリームはいくつかのカテゴリ (すべて抽象インターフェイス:

) に分類されます。

1.stream.Readable 読み取り可能なストリーム (_read メソッドを実装する必要があります。焦点はデータ ストリームの読み取りの詳細にあります
) 2.stream.Writable 書き込み可能なストリーム (_write メソッドを実装する必要があります。焦点はデータ ストリーム
の書き込みの詳細にあります) 3.stream.Duplex 読み取り/書き込みストリーム (上記の 2 つのインターフェイスを実装する必要があります。上記の 2 つのインターフェイスの詳細に注目してください
4.stream.Transform Duplex から継承 (_transform メソッドを実装する必要があります。焦点はデータ ブロックの処理です

)

簡単に言うと:

1) .pipe() の所有者は、一連の「readable」/「data」/「end」/「close」/「error」イベントを持つ読み取り可能なストリーム (ただし、これに限定されない) 機能を持っている必要があります。サブスクリプションは、
を呼び出すための .read()/.pause()/.resume() などの一連のメソッドも提供します。 2) .pipe() のパラメータには書き込み可能なストリーム機能が必要です (ただし、これに限定されません)。アクセス用の 'drain'/'pipe'/'unpipe'/'error'/'finish' イベントがあり、 も提供されます。

の呼び出しには、write()/.end() やその他のメソッドが利用可能です

一体何だ

少しでも不安を感じていませんか?心配しないでください。人間の言語を話す低レベルのプログラマーとして、私は Stream を分解して、それについてお話します。

Node.js ソース コード 内の Stream クラスは次のように定義されています:

コードをコピー コードは次のとおりです:

var EE = require('events').EventEmitter;
var util = require('util');
util.inherits(ストリーム、EE);

関数 Stream() {
EE.call(this);
}

ご覧のとおり、Stream は本質的に EventEmitter であり、イベント駆動型の関数 (.emit/.on...) があることを意味します。ご存知のとおり、「Node.js は V8 をベースとしたイベント駆動型プラットフォーム」であり、イベント駆動型のストリーミング プログラミングを実装し、Node と同じ非同期コールバック特性を備えています。

たとえば、読み取り可能ストリームには読み取り可能イベントがあり、一時停止された読み取り専用ストリームでは、データ ブロックを読み取る準備ができている限り、サブスクライバーに送信されます (読み取り可能ストリームとは何ですか)。 ? Express) req、ftp または複数フォームアップロードコンポーネントの req.part、システムの標準入力プロセス.stdin など)。読み取り可能なイベントを使用すると、シェル コマンドの出力を処理するパーサーなどのツールを作成できます:

コードをコピー コードは次のとおりです:

process.stdin.on('読み取り可能', function(){
var buf = process.stdin.read();
if(buf){
var data = buf.toString();
// データを解析しています ... }
});

次のように呼び出します:

コードをコピーします コードは次のとおりです:

head -10 some.txt ノード parser.js

Readable ストリームの場合、古典的なソケットの例 のように、そのデータと終了イベントをサブスクライブしてデータのチャンクを取得し、ストリームが使い果たされたときに通知を受け取ることもできます。

コードをコピー コードは次のとおりです:
req.on('connect', function(res, ソケット, ヘッド) {
ソケット.on('データ', 関数(チャンク) {
console.log(chunk.toString());
});
ソケット.on('end', function() {
proxy.close();
});
});

読み取り可能なストリームステータスの切り替え
Readable ストリームには、フロー モード (トレント) と一時停止モード (一時停止) の 2 つの状態があることに注意してください。前者はまったく停止できず、パイプされた相手にフィードを送り続けますが、後者はダウンストリームが明示的に Stream.read() リクエストを呼び出してデータ ブロックを読み取るまで一時停止します。 Readable ストリームは、初期化時に一時停止モードになります。

これら 2 つの状態は相互に切り替えることができます。

次のいずれかの動作が発生した場合、一時停止が流れに変わります:

1. データ イベント サブスクリプションを Readable ストリームに追加します

2. Readable で .resume() を呼び出して、フロー
を明示的に有効にします 3. Readable ストリームの .pipe(writable) を呼び出して、Writable ストリームにブリッジします

次の動作のいずれかが発生した場合、フローは一時停止に戻ります:

1.Readable ストリームはまだどのストリームにもパイプされていません。調整可能な .pause() を使用して一時停止できます

2. Readable ストリームはストリームにパイプされています。すべてのデータ イベント サブスクリプションを削除し、.unpipe() メソッドを呼び出して、ダウンストリーム ストリームとの関係を 1 つずつ解放する必要があります。

素晴らしい使い方

ストリームの非同期特性と組み合わせると、次のようなアプリケーションを作成できます。ユーザー A の出力をユーザー B のページの出力に直接ブリッジします。


コードをコピー コードは次のとおりです:
router.post('/post', function(req, res) {
var destination = req.headers['destination'] //送信先
; キャッシュ[宛先] = req;
//はい、返されないので、ajax リクエストを行うのが最善です
});

ユーザー B がリクエストした場合:

コードをコピーします コードは次のとおりです:
router.get('/inbox', function(req, res){
var user = req.headers['user'];
cache.find(user, function(err,previousReq){ //以前に保存した req を検索
var form = new multiparty.Form();
form.parse(previousReq) // 私用のファイルがあります
form.on('part', function (part) {
part.pipe(res) //ストリーミングメソッドは良いです:)

part.on('error', function (err) {
console.log(err);
messageging.setRequestDone(uniqueID);
return res.end(err);
});
});
});
});

参考

ストリームを使用したノード プログラムの作成方法: ストリーム ハンドブック

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Nodeのメモリ制御に関する記事 Nodeのメモリ制御に関する記事 Apr 26, 2023 pm 05:37 PM

ノンブロッキングおよびイベント駆動に基づいて構築されたノード サービスには、メモリ消費量が少ないという利点があり、大量のネットワーク リクエストの処理に非常に適しています。大量のリクエストを前提として、「メモリ制御」に関する問題を考慮する必要があります。 1. V8 のガベージ コレクション メカニズムとメモリ制限 Js はガベージ コレクション マシンによって制御されます

Node V8 エンジンのメモリと GC の詳細な図による説明 Node V8 エンジンのメモリと GC の詳細な図による説明 Mar 29, 2023 pm 06:02 PM

この記事では、NodeJS V8 エンジンのメモリとガベージ コレクター (GC) について詳しく説明します。

Node の File モジュールについて詳しく説明しましょう Node の File モジュールについて詳しく説明しましょう Apr 24, 2023 pm 05:49 PM

ファイル モジュールは、ファイルの読み取り/書き込み/開く/閉じる/削除の追加など、基礎となるファイル操作をカプセル化したものです。ファイル モジュールの最大の特徴は、すべてのメソッドが **同期** と ** の 2 つのバージョンを提供することです。 asynchronous**、sync サフィックスが付いているメソッドはすべて同期メソッドであり、持たないメソッドはすべて異種メソッドです。

Nodeのイベントループについて話しましょう Nodeのイベントループについて話しましょう Apr 11, 2023 pm 07:08 PM

イベント ループは Node.js の基本的な部分であり、メイン スレッドがブロックされていないことを確認することで非同期プログラミングが可能になります。イベント ループを理解することは、効率的なアプリケーションを構築するために重要です。次の記事では、Node のイベント ループについて詳しく説明します。お役に立てれば幸いです。

ノードがnpmコマンドを使用できない場合はどうすればよいですか? ノードがnpmコマンドを使用できない場合はどうすればよいですか? Feb 08, 2023 am 10:09 AM

ノードが npm コマンドを使用できない理由は、環境変数が正しく設定されていないためです。解決策は次のとおりです: 1. 「システムのプロパティ」を開きます; 2. 「環境変数」->「システム変数」を見つけて、環境を編集します。変数; 3.nodejs フォルダーの場所を見つけます; 4.「OK」をクリックします。

IntelliJ IDEA で Java Stream 操作をデバッグする方法 IntelliJ IDEA で Java Stream 操作をデバッグする方法 May 09, 2023 am 11:25 AM

ストリーム操作は Java8 のハイライトです。 java.util.stream は非常に強力ですが、実際の作業ではほとんど使用していない開発者がまだ多くいます。最も不満の理由の 1 つは、デバッグが難しいということです。実際、最初の頃はそうでした。 as stream は DEBUG では使用できません 1 行のコードだと、実際には次のステップになると多くの操作が一度に渡されるため、どの行に問題があるのか​​判断するのが困難です。プラグイン: JavaStreamDebugger 使用している IDEA バージョンが比較的新しい場合、このプラグインはすでに含まれているため、インストールする必要はありません。まだインストールされていない場合は、手動でインストールしてから以下に進みます。

ノードのバッファーについて詳しく見る ノードのバッファーについて詳しく見る Apr 25, 2023 pm 07:49 PM

当初、JS はブラウザ側でのみ動作していたため、Unicode でエンコードされた文字列の処理は簡単でしたが、バイナリ文字列や非 Unicode エンコード文字列の処理は困難でした。バイナリは、コンピュータのビデオ/オーディオ/プログラム/ネットワーク パッケージの最低レベルのデータ形式です。

プレゼンテーション層の Node.js アプリケーションを効率的に開発する方法について説明する記事 プレゼンテーション層の Node.js アプリケーションを効率的に開発する方法について説明する記事 Apr 17, 2023 pm 07:02 PM

フロントエンド アプリケーション開発に Node.js を使用するにはどうすればよいですか?次の記事では、Node でフロントエンド アプリケーションを開発する方法 (プレゼンテーション層アプリケーションの開発を含む) を紹介します。今日私が共有したソリューションは単純なシナリオ向けであり、フロントエンド開発者がコーディング経験がなくても、Node.js に関する背景知識や専門知識を習得することなく、いくつかの単純なサーバーサイド開発タスクを完了できるようにすることを目的としています。

See all articles