web-dev-qa-db-ja.com

Node.jsのStreams3とは何ですか?Streams2とどう違うのですか?

Streams2や古いストリームをよく耳にしますが、Streams3とは何ですか? この話でトールステン・ローレンツが言及している

それについてどこで読むことができ、Streams2とStreams3の違いは何ですか。

Googleで検索を行うと、 Node 0.11.5の変更ログ にも記載されていることがわかります。

ストリーム:流れるパッシブデータリスニングを簡素化(ストリーム3)(ISAAC)

51
Evan Carroll

私はこれを試してみるつもりですが、おそらく間違っています。 Streams1(old-streams)やStreams2を書いたことがないので、私はおそらくこれに自己回答するのは適切ではありませんが、これでうまくいきます。まだある程度残っているStreams1 APIがあるようです。 Streams2には、2つのストリームモードflowing(legacy)とnon-flowingがあります。つまり、フローモードをサポートしていたシムはなくなります。これは 現在呼び出されているパッチにつながるメッセージStreams3 でした、

Stream2と同じAPIですが、フロー/古いモードスイッチの混乱を招くモダリティを削除します。

  1. read()が呼び出されてデータが返されるたびに、データイベントが発生します。
  2. resume()は、read()を繰り返し呼び出します。それ以外の場合、変更はありません。
  3. pause()は、read()の呼び出しを繰り返し停止します。
  4. pipe(dest)on('data', fn)は自動的にresume()を呼び出します。
  5. 古いモードに切り替えません。流れているだけで、一時停止しています。ストリームは一時停止して開始します。

残念ながら、Streams3を適切に定義している記述を理解するには、まずStreams1とレガシーストリームを理解する必要があります。

バックストーリー

まず、2つのモードについてNode v0.10.25 docsが言うことを見てみましょう。

読み取り可能なストリームには、フローモードと非フローモードの2つの「モード」があります。フローモードの場合、データは基盤となるシステムから読み取られ、できるだけ早くプログラムに提供されます。非フローモードでは、stream.read()を明示的に呼び出してデータのチャンクを取得する必要があります。Node v0.10.25 Docs

Isaac Z. Schlueterが11月に私が掘り起こしたスライドで言った

ストリーム2

  • 「吸うストリーム」
  • 「データ」イベントが噴出する代わりに、read()を呼び出してソースからデータをプルします
  • (私たちが知っている)すべての問題を解決します

つまり、streams1ではオブジェクトを作成し、そのオブジェクトに対して.on('data', cb)を呼び出すように見えます。これはイベントをトリガーに設定し、ストリームのなすがままになりました。 Streams2では、内部的にストリームにバッファがあり、それらのストリームからのデータを明示的に要求します( `.readを使用して)。 Isaacは、Streams1(旧ストリーム)モジュールの機能を維持するために、Streams2で後方互換性がどのように機能するかを指定し続けます

オールドモードストリーム1シム

  • 新しいストリームはオールドモードに切り替わり、「データ」を吐き出す
  • 'data'イベントハンドラーを追加するか、pau​​se()またはresume()を呼び出す場合は、
  • 既存のテストに最小限の変更を加えて正直に保つ

したがって、Streams2では、.pause()または.resume()を呼び出すとシムがトリガーされます。そして、それは正しいでしょうか? Streams2では、.read()をいつ実行するかを制御でき、スローされているものをキャッチしていません。これにより、Streams2とは独立して動作するレガシーモードがトリガーされました。

アイザックのスライドの例を見てみましょう。

createServer(function(q,s) {
  // ADVISORY only!
  q.pause()
  session(q, function(ses) {
    q.on('data', handler)
    q.resume()
  })
})
  • Streams1では、qはすぐに開始し、q.pauseへの呼び出しがqにデータのプルを停止するようにアドバイスするまでイベントを発行しないで、すでに読み取ったものをクリアします。
  • Streams2では、qは、古いモードをエミュレートすることを意味する.pause()の呼び出しまで一時停止されます。
  • Streams3では、qは、ファイルハンドルから一度も読み取らなかったため一時停止してq.pause()をnoopとして開始し、q.on('data', cb)を呼び出すとq.resumeが呼び出されるまで、バッファにこれ以上のデータはありません。そして、同じことをもう一度q.resumeを呼び出します。
44
Evan Carroll

Streams3はio.jsで導入されたようですが、Node 0.11+

ストリーム1ストリームにプッシュされるサポートされているデータ。消費者による制御はなく、準備ができているかどうかに関係なく、消費者にデータがスローされました。

ストリーム2では、ストリーム1に従ってデータをストリームにプッシュしたり、コンシューマーが必要に応じてストリームからデータをプルしたりできます。コンシューマは、プルモードでデータのフローを制御できます(使用可能なデータが通知されたときにstream.read()を使用)。ストリームは、プッシュとプルの両方を同時にサポートできません。

Streams 3では、同じストリーム上でデータをプルおよびプッシュできます。

ここで素晴らしい概要:

https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/

6
Joe