55 votes

Qu'est-ce que Streams3 dans Node.js et en quoi diffère-t-il de Streams2 ?

J'ai souvent entendu parler de Streams2 et de old-streams, mais qu'est-ce que Streams3 ? Il est mentionné dans cet exposé de Thorsten Lorenz. .

Où puis-je trouver des informations à ce sujet et quelle est la différence entre Streams2 et Streams3 ?

En faisant une recherche sur Google, je vois aussi qu'il est mentionné dans le Changelog de Node 0.11.5 ,

flux : Simplifier l'écoute passive des données en flux (streams3) (isaacs)

0 votes

Article brillant sur les flux1,2 et 3 : medium.com/the-node-js-collection/

50voto

Evan Carroll Points 13420

Je vais tenter le coup, mais je me suis probablement trompé. N'ayant jamais écrit Streams1 (old-streams) ou Streams2, je ne suis probablement pas la personne la mieux placée pour répondre à cette question, mais voilà. Il semble qu'il existe une API Streams1 qui persiste dans une certaine mesure. Dans Streams2, il existe deux modes de streaming qui coule (héritage), et non coulant . En bref, la cale qui soutenait le mode d'écoulement disparaît. C'était le qui a conduit au patch désormais appelé Streams3 ,

Même API que streams2, mais supprime la confusion entre le mode de flux et le mode ancien. mode switch.

  1. Chaque fois read() est appelé et renvoie des données, un événement de données se déclenche.
  2. resume() le fera appeler read() de manière répétée. Sinon, aucun changement.
  3. pause() le fera cesser d'appeler read() de façon répétée.
  4. pipe(dest) y on('data', fn) appelle automatiquement resume() .
  5. Pas de passage à l'ancien mode. Il n'y a que des flux, et des pauses. Les flux commencent en pause.

Malheureusement, pour comprendre l'une ou l'autre de ces descriptions, qui définissent assez bien Streams3, vous devez d'abord comprendre Streams1 et les anciens flux.

Backstory

Tout d'abord, regardons ce que la documentation de Node v0.10.25 dit sur les deux modes,

Les flux lisibles ont deux "modes" : un mode flottant et un mode non flottant. En mode fluide, les données sont lues depuis le système sous-jacent et fournies à votre programme aussi rapidement que possible. En mode non-fluidant, vous devez appeler explicitement stream.read() pour obtenir des morceaux de données. - Docs sur Node v0.10.25

Isaac Z. Schlueter a dit dans des diapositives de novembre que j'ai déterrées :

streams2

  • "sucer des ruisseaux"
  • Au lieu de cracher des événements 'data', appelez read() pour extraire les données de la source.
  • Résout tous les problèmes (à notre connaissance)

Donc il semble que dans streams1, vous créez un objet et appelez .on('data', cb) à cet objet. Cela permettait de déclencher l'événement, et vous étiez alors à la merci du flux. Dans Streams2, les flux internes ont des tampons et vous demandez des données à ces flux explicitement (en utilisant `.read). Isaac précise ensuite comment la compatibilité descendante fonctionne dans Streams2 pour que les modules Streams1 (old-stream) continuent à fonctionner.

shim streams1 old-mode

  • Les nouveaux flux peuvent passer en mode ancien, où ils crachent des "données".
  • Si vous ajoutez un gestionnaire d'événement 'data', ou si vous appelez pause() ou resume(), alors le commutateur de l'événement 'data' est activé.
  • Apporter des modifications minimales aux tests existants pour que nous restions honnêtes.

Ainsi, dans Streams2, un appel à .pause() o .resume() déclenche la cale. Et, ça devrait, non ? Dans Streams2, vous avez le contrôle sur le moment où la .read() et tu n'attrapes pas les trucs qui te sont lancés. Cela a déclenché un mode hérité qui a agi indépendamment de Streams2.

Prenons un exemple de la diapositive d'Isaac,

createServer(function(q,s) {
  // ADVISORY only!
  q.pause()
  session(q, function(ses) {
    q.on('data', handler)
    q.resume()
  })
})
  • Dans Streams1, q commence tout de suite à lire et à émettre (en perdant probablement des données), jusqu'à ce que l'appel à q.pause conseille q pour arrêter d'aspirer des données mais pas d'émettre des événements pour effacer ce qu'il a déjà lu.
  • Dans Streams2, q est en pause jusqu'à ce que l'appel à .pause() ce qui signifie émuler l'ancien mode.
  • Dans Streams3, q démarre en tant que pausé, n'ayant jamais lu depuis la poignée du fichier, ce qui fait que les q.pause() un noop, et sur l'appel à q.on('data', cb) appellera q.resume jusqu'à ce qu'il n'y ait plus de données dans le tampon. Et, ensuite, appelez à nouveau q.resume qui font la même chose.

0 votes

Je pense que votre premier point est faux. Appeler read() ne déclenche aucun événement, le flux est toujours en mode pause, et vous obtenez autant d'octets que vous le demandez. Le simple fait d'ajouter un gestionnaire à l'évènement 'data' fait passer le flux en mode 'flowing' et vous commencerez à recevoir des évènements 'data' jusqu'à ce qu'il soit terminé.

8voto

Joe Points 186

Il semble que Streams3 ait été introduit dans io.js, puis dans Node 0.11+.

Streams 1 Les données prises en charge sont poussées vers un flux. Il n'y avait pas de contrôle du consommateur, les données étaient envoyées au consommateur qu'il soit prêt ou non.

Streams 2 permet de pousser les données vers un flux comme pour Streams 1, ou pour un consommateur de tirer des données d'un flux selon les besoins. Le consommateur peut contrôler le flux de données en mode pull (en utilisant stream.read() lorsqu'il est informé de la disponibilité de données). Le flux ne peut pas prendre en charge le push et le pull en même temps.

Streams 3 permet de tirer et de pousser des données sur le même flux.

Une excellente vue d'ensemble ici :

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

Une version en cache (consultée le 8/2020) est ici : https://hackerfall.com/story/whats-new-in-iojs-10-beta-streams-3

-5voto

Pablote Points 1149

Je vous suggère de lire la documentation, plus particulièrement la section "API for Stream Consumers", c'est en fait très compréhensible, d'ailleurs je pense que l'autre réponse est fausse : http://nodejs.org/api/stream.html#stream_readable_read_size

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X