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?
data-structures
elliot42
la source
la source
Réponses:
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.
la source
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.(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.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
Seek
opération, surtout si vous lisez à partir d'eux.la source
FileStream
peut être ouvert enReadWrite
mode.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.
la source
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.
la source
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:
C'est l'intention de ces termes. Ce sont des métaphores. (comme tout le reste) (Chut! tu vas ruiner l'histoire!)
la source
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.
la source
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 ).
la source
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é.
la source