Quelle est la différence entre un flux et une file d'attente?

13

Quelle est la différence entre un flux et une file d'attente? Ils ont tous deux le concept d'un ensemble ordonné d'éléments, mais ont tendance à avoir des implémentations différentes et un vocabulaire différent de `` insérer '' / `` extraire '' (flux) par rapport à `` enqueue '' / `` dequeue '' (file d'attente). Sont-ils interchangeables? Suggèrent-ils différents concepts ou modèles? Si oui, quelles sont les différences?

elliot42
la source
Apparemment, «flux» fait référence à différentes choses dans différents contextes. Il existe des différences de caractéristiques entre un flux de caractères et l' interface Windows IStream dans COM par rapport à un flux d'événements dans l'architecture. Pouvez-vous clarifier?
rwong
Un bûcheron récolte de l'eau d'un ruisseau, mais il ne consomme pas toute l'eau. Il y a donc un sentiment de rassembler une quantité d'un flux sans la consommer entièrement. En revanche, les éléments d'une file d'attente peuvent être épuisés.
emallove

Réponses:

11

Un flux n'est pas vraiment une structure de données en tant que telle (conceptuellement), mais une séquence de signaux cohérents codés numériquement (paquets de données ou paquets de données) utilisés pour transmettre ou recevoir des informations ". Donc, fondamentalement, une séquence de données.

Une file d'attente est un mécanisme FIFO simple qui vous permet d'ajouter des éléments à l'arrière de la file d'attente ou de les prendre par l'avant.

Les flux ont toujours une source, par exemple un fichier, un emplacement réseau, etc. Une file d'attente ne contient intrinsèquement aucune donnée.

Donc, essentiellement, leur concept est assez différent et, comme l'a souligné Mason, ils sont utilisés différemment.

Vague De Chaleur
la source
Il y a en fait une structure de données appelée "stream", avec (effectivement) une liste de données à consommer, avec une fonction de producteur à sa queue, appelable si vous avez besoin de plus d'éléments.
Vatine
La commande Unix 'yes' ressemble à un flux mais n'a pas de source de données particulière.
JBRWilkinson
@JBRWilkinson: exécuté sans argument, la source de données pour yes(1)est la chaîne par défaut intégrée. Exécuter avec un argument, c'est tout ce qui a fourni l'argument.
Blrfl
Oui, vous avez raison - toutes les données doivent provenir de quelque part. Peut-être que le point réel ici est qu'une file d'attente pourrait être vide et qu'un flux, par définition, ne l'est généralement pas?
JBRWilkinson
2
@JBRWilkinson Ce n'est pas le cas. Dans Scheme, (stream)renvoie un flux vide. De plus, cette réponse est fausse, un flux est une structure de données, les flux peuvent ne pas avoir de source et les flux ne contiennent pas de données de manière inhérente, ils peuvent être nuls ou nuls ou la liste vide. Voir SRFI-41 pour plus d'informations.
nounou
5

La différence fondamentale réside dans la façon dont ils sont utilisés. Dans un flux, vous n'utilisez généralement qu'un seul côté de l'opération: vous ouvrez un flux pour lire ou écrire, mais pas les deux. Alors qu'avec une file d'attente, vous mettez des articles et les retirez.

De plus, les files d'attente sont très strictes quant à l'ordre dans lequel vous mettez et retirez les choses, tandis que les flux prennent souvent (mais pas toujours) en charge une Seekopération, surtout si vous lisez à partir d'eux.

Mason Wheeler
la source
3
FileStreampeut être ouvert en ReadWritemode.
Robert Harvey
2
..et les files d'attente prioritaires donnent des options sur l'ordre
Petter Nordlander
5

D'après mon expérience, un flux est une séquence d'octets qui sont produits / consommés à un rythme souvent déterminé par les données du flux. Par exemple, un flux de données MPEG aura des en-têtes de trame qui décrivent ce que fait la prochaine séquence d'octets et combien doivent être consommés. La sérialisation binaire d'un document serait similaire. Il n'est pas toujours auto-descriptif: l'écriture dans STDOUT peut être effectuée de manière rationnelle, mais il peut s'agir de données lisibles par l'homme / non analysables.

Inversement, une file d'attente est généralement d'un type d'objet bien connu (ou d'objets prenant en charge l'interface) qui sont consommés dans leur intégralité. Un exemple peut être une file d'attente de travaux de base de données qui sont traités par un certain nombre de travailleurs de base de données.

JBRWilkinson
la source
5

Une différence entre un flux et une file d'attente est la façon dont le débit de données est contrôlé:

  • dans une file d'attente, l'expéditeur s'adapte à la vitesse du lecteur. L'expéditeur décide quoi faire si la file d'attente est pleine: attendez la disponibilité de la file d'attente ou jetez les données.

  • dans un flux, le lecteur s'adapte à la vitesse de l'expéditeur. Le lecteur décide quoi faire si de nouvelles données arrivent avant que les anciennes aient été consommées.

Dans cette perspective, les flux de caractères tels que les canaux Unix ne seraient pas qualifiés de flux mais de files d'attente.

mouviciel
la source
Dans le streaming vidéo adaptatif, le serveur s'adaptera à un flux de fidélité inférieur car le client ne suit pas.
JBRWilkinson
@JBRWilkinson - Dans le streaming vidéo adaptatif , le serveur envoie simplement plusieurs variantes d'un flux à différents débits binaires. Il incombe toujours au client de choisir parmi ces flux.
mouviciel
Oui, le streaming HTTP fait ça. Je voulais dire les appels vidéo qui sont point à point et les données ne sont pas pré-encodées. Mon mauvais - j'aurais dû être explicite.
JBRWilkinson
L'intention d'un flux de caractères est que les données soient consommées plus ou moins à mesure qu'elles sont produites: il s'agit d'un flux de données plutôt que d'un moyen de les conserver. Nous savons que ce n'est pas parfait dans la pratique, mais d'un point de vue métaphorique, cela devrait être vrai: le lecteur peut traiter le flux aussi vite qu'il arrive.
5

Si nous réfléchissons plus visuellement à la façon dont les mots sont couramment utilisés , nous pouvons éviter l'encombrement d'utilisations spécifiques par des langages et des implémentations particuliers, afin que ces termes puissent réellement signifier quelque chose:

  • Une file d' attente de personnes fait la queue et est servie une par une. Plus de gens rejoignent la file d'attente à la queue. Tout le monde attend que le service progresse et que le temps de service devrait varier. Vous pouvez parler du nombre total de personnes servies.
  • Un flux de personnes, par exemple en sortant d'un bâtiment par une porte, n'est pas desservi un à un, il passe juste le point de sortie à un rythme plus ou moins constant. Des retards ne sont pas attendus et ne sont pas bien tolérés. Vous pouvez parler d'un taux de personnes: un par seconde.

C'est l'intention de ces termes. Ce sont des métaphores. (comme tout le reste) (Chut! tu vas ruiner l'histoire!)


la source
2

Une file d'attente est un concept de niveau supérieur à un flux. Les éléments de base d'une file d'attente sont un message / objet, qui est une structure de données cohérente (généralement typée) qui peut être interprétée par le consommateur seul. D'un autre côté, à la base d'un flux , il y a (généralement de taille fixe) des bits / octets / caractères qui, à eux seuls, n'ont généralement aucun sens pour l'application. Une séquence de ces caractères peut composer un "message", mais une API de flux laisse à l'application le soin de diviser la séquence de caractères en morceaux sensibles.

Une API de flux permet généralement également des lectures et des écritures partielles, si les tampons de flux sont pleins et que l'autre côté ne lit / écrit pas; les applications qui gèrent les files d'attente s'attendent généralement à ce que la file d'attente les gère en interne.

Une file d'attente peut être implémentée au-dessus d'un flux, cela se fait en implémentant le cadrage des messages. Par exemple, TCP fournit une interface de flux, HTTP est construit au-dessus de TCP et ajoute un cadrage des messages à l'aide d'un codage de transfert Content-Length / chunked. Les utilisateurs d'une API de connexion HTTP ne sont pas confrontés à la division du flux de connexion HTTP en requêtes HTTP.

D'un autre côté, il est généralement moins judicieux d'implémenter une API de flux au-dessus d'une file d'attente, car la gestion du cadrage des messages ajoute une surcharge inutile.

Lie Ryan
la source
Il convient d'ajouter que l'API pour la file d'attente produit / consomme généralement un seul élément à la fois, tandis que l'API de streaming produit / consomme généralement plusieurs "mots" à la fois. Bien que je convienne, que la caractéristique qui définit est qu'une file d'attente de haut niveau et structurée, tandis qu'un flux est de bas niveau et sans structure.
Alexey
0

Dans les langages de programmation fonctionnels (par exemple Scala), et peut-être aussi dans d'autres langages, les flux sont plus comme des listes fonctionnelles et ce sont des files d'attente. Je dois cependant noter que les files d'attente peuvent en fait être mises en œuvre à l'aide d'une paire de listes . À Scala et probablement ailleurs, un Stream est juste une liste paresseuse - plus précisément, la queue de la liste est un lazy val.

Les flux fonctionnels peuvent partager une certaine similitude avec les files d'attente, par opposition aux listes, dans la mesure où vous pouvez les utiliser de manière à ne pas garder de référence à la tête du flux - mais vous devez être prudent: https: // stackoverflow.com/a/5159356/3096687 . Ceci est quelque peu analogue à un appel de mise en file d'attente vers une file d'attente (bien que dans le cas d'un flux, vous le faites implicitement: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).

bbarker
la source
-1

Stream est un concept / cadre pour produire et consommer une séquence infinie de données en série ou en parallèle ou en masse. Que est une structure de données à travers laquelle le flux peut être implémenté. tout comme list ou seq à travers lequel le flux peut être implémenté.

user3423890
la source