Was ist der Unterschied zwischen einem Stream und einer Warteschlange?

13

Was ist der Unterschied zwischen einem Stream und einer Warteschlange? Beide haben das Konzept einer geordneten Menge von Elementen, haben jedoch tendenziell unterschiedliche Implementierungen und ein unterschiedliches Vokabular von 'Einfügen' / 'Extrahieren' (Streams) vs. 'Enqueue' / 'Dequeue' (Warteschlange). Sind diese austauschbar? Schlagen sie unterschiedliche Konzepte oder Muster vor? Wenn ja, was sind die Unterschiede?

elliot42
quelle
Anscheinend bezieht sich "Strom" auf verschiedene Dinge in verschiedenen Kontexten. Es gibt Unterschiede in den Eigenschaften zwischen einem Zeichenstrom und der Windows IStream-Schnittstelle in COM und einem Ereignisstrom in der Architektur. Könntest Du das erläutern?
Rwong
Ein Waldarbeiter sammelt etwas Wasser aus einem Bach, verbraucht aber nicht das ganze Wasser. Es besteht also das Gefühl, einen Betrag aus einem Stream zu sammeln, ohne ihn vollständig zu verbrauchen. Andererseits können Elemente in einer Warteschlange erschöpft sein.
emallove

Antworten:

11

Ein Stream ist nicht wirklich eine Datenstruktur als solche (konzeptionell), sondern eine Folge von digital codierten kohärenten Signalen (Datenpakete oder Datenpakete), die zum Senden oder Empfangen von Informationen verwendet werden. "Also im Grunde eine Folge von Daten.

Eine Warteschlange ist ein einfacher FIFO-Mechanismus, mit dem Sie Elemente hinten in der Warteschlange hinzufügen oder von vorne nehmen können.

Streams haben immer eine Quelle, z. B. eine Datei, einen Netzwerkspeicherort usw. Eine Warteschlange enthält von Natur aus keine Daten.

Im Wesentlichen unterscheiden sie sich im Konzept erheblich, und wie Mason betonte, werden sie unterschiedlich verwendet.

Hitzewelle
quelle
Es gibt tatsächlich eine Datenstruktur namens "Stream" mit (effektiv) einer Liste der zu konsumierenden Daten mit einer Produzentenfunktion am Ende, die aufgerufen werden kann, wenn Sie mehr Elemente benötigen.
Vatine
Der Unix-Befehl 'yes' sieht aus wie ein Stream, hat jedoch keine bestimmte Datenquelle.
JBRWilkinson
@JBRWilkinson: Wird ohne Argument ausgeführt. Die Datenquelle für yes(1)ist die eingebettete Standardzeichenfolge. Führen Sie mit einem Argument aus, es ist das, was das Argument geliefert hat.
Blrfl
Ja, Sie haben Recht - alle Daten müssen von irgendwoher kommen. Vielleicht ist der eigentliche Punkt hier, dass eine Warteschlange leer sein könnte und ein Stream per Definition normalerweise nicht?
JBRWilkinson
2
@JBRWilkinson Das ist nicht der Fall. Gibt im Schema (stream)einen leeren Stream zurück. Diese Antwort ist auch falsch, ein Stream ist eine Datenstruktur, Streams haben möglicherweise keine Quelle und Streams enthalten von Natur aus keine Daten. Sie können null oder null oder die leere Liste sein. Weitere Informationen finden Sie unter SRFI-41 .
Kindermädchen
5

Der grundlegende Unterschied liegt in der Art und Weise, wie sie verwendet werden. In einem Stream verwenden Sie normalerweise nur eine Seite des Vorgangs: Sie öffnen einen Stream zum Lesen oder Schreiben, aber nicht für beide. Während Sie mit einer Warteschlange Gegenstände an- und ausziehen.

Außerdem sind die Warteschlangen in Bezug auf die Reihenfolge, in der Sie Dinge ein- und ausbauen, sehr streng, während Streams häufig (aber nicht immer) einen SeekVorgang unterstützen, insbesondere wenn Sie daraus lesen.

Mason Wheeler
quelle
3
FileStreamkann im ReadWriteModus geöffnet werden.
Robert Harvey
2
..und Prioritätswarteschlangen gibt Optionen zur Bestellung
Petter Nordlander
5

Nach meiner Erfahrung ist ein Stream eine Folge von Bytes, die mit einer Rate erzeugt / verbraucht werden, die häufig durch Daten innerhalb des Streams bestimmt wird. Beispielsweise enthält ein MPEG-Datenstrom Frame-Header, die beschreiben, was die nächste Folge von Bytes bewirkt und wie viele verbraucht werden müssen. Die binäre Serialisierung eines Dokuments wäre ähnlich. Es ist nicht immer selbstbeschreibend: Das Schreiben in STDOUT kann streamweise erfolgen, es kann sich jedoch um von Menschen lesbare / nicht analysierbare Daten handeln.

Umgekehrt handelt es sich bei einer Warteschlange normalerweise um einen bekannten Objekttyp (oder um schnittstellenunterstützende Objekte), die vollständig verwendet werden. Ein Beispiel könnte eine Warteschlange von Datenbankjobs sein, die von einer Reihe von Datenbankarbeitern verarbeitet werden.

JBRWilkinson
quelle
5

Ein Unterschied zwischen einem Stream und einer Warteschlange besteht in der Steuerung der Datenrate:

  • In einer Warteschlange passt sich der Absender der Geschwindigkeit des Lesers an. Der Absender entscheidet, was zu tun ist, wenn die Warteschlange voll ist: Warten Sie auf die Verfügbarkeit der Warteschlange oder werfen Sie Daten weg.

  • In einem Stream passt sich der Leser an die Geschwindigkeit des Absenders an. Der Leser entscheidet, was zu tun ist, wenn neue Daten eintreffen, bevor alte verbraucht wurden.

Mit dieser Perspektive würden Zeichenströme wie Unix-Pipes nicht als Streams, sondern als Warteschlangen qualifiziert.

Mouviciel
quelle
Beim adaptiven Video-Streaming stellt sich der Server auf einen Stream mit niedrigerer Wiedergabetreue ein, da der Client nicht Schritt hält.
JBRWilkinson
@JBRWilkinson - Beim adaptiven Video-Streaming sendet der Server nur mehrere Varianten eines Streams mit unterschiedlichen Bitraten. Es liegt weiterhin in der Verantwortung des Kunden, zwischen diesen Streams zu wählen.
Mouviciel
Ja, das macht HTTP-Streaming. Ich meinte Videoanrufe, die Punkt-zu-Punkt sind und bei denen die Daten nicht vorcodiert sind. Mein schlechtes - ich hätte explizit sein sollen.
JBRWilkinson
Die Absicht eines Zeichenstroms ist, dass die Daten mehr oder weniger verbraucht werden, wenn sie erzeugt werden: Es handelt sich eher um einen Datenfluss als um ein Mittel, um sie zu speichern. Wir wissen, dass dies in der Praxis nicht perfekt ist, aber von einem metaphorischen Standpunkt aus wird erwartet, dass es wahr ist: Der Leser kann den Stream so schnell verarbeiten, wie er
5

Wenn wir visueller darüber nachdenken, wie die Wörter häufig verwendet werden , können wir das Durcheinander bestimmter Verwendungen durch bestimmte Sprachen und Implementierungen vermeiden, sodass diese Begriffe tatsächlich etwas bedeuten können:

  • Eine Schlange von Leuten wartet in der Schlange und wird einzeln bedient. Mehr Leute treten in die Warteschlange am Schwanz ein. Jeder wartet, während der Service fortgesetzt wird, und die Servicezeit wird voraussichtlich variieren. Sie können davon sprechen, wie viele Personen insgesamt bedient werden.
  • Ein Strom von Menschen, der beispielsweise ein Gebäude durch eine Tür verlässt, wird nicht einzeln bedient, sondern passiert den Austrittspunkt nur mehr oder weniger gleichmäßig. Verzögerungen werden nicht erwartet und nicht gut vertragen. Sie können von einer Rate von Personen sprechen: eine pro Sekunde.

Das ist die Absicht dieser Begriffe. Sie sind Metaphern. (wie alles andere) (Shhh! Du wirst die Geschichte ruinieren!)


quelle
2

Eine Warteschlange ist ein übergeordnetes Konzept als ein Stream. Die Basiselemente einer Warteschlange sind eine Nachricht / ein Objekt, bei dem es sich um eine kohärente (normalerweise typisierte) Datenstruktur handelt, die vom Verbraucher selbst interpretiert werden kann. Andererseits gibt es an der Basis eines Streams (normalerweise feste Größe) Bits / Bytes / Zeichen, was für die Anwendung für sich genommen normalerweise bedeutungslos ist. Eine Folge dieser Zeichen kann eine "Nachricht" bilden, aber eine Stream-API überlässt es der Anwendung, die Folge von Zeichen in sinnvolle Abschnitte aufzuteilen.

Eine Stream-API ermöglicht normalerweise auch teilweise Lese- und Schreibvorgänge, wenn die Stream-Puffer voll sind und die andere Seite nicht liest / schreibt. Anwendungen, die Warteschlangen verarbeiten, erwarten normalerweise, dass die Warteschlange diese intern verarbeitet.

Eine Warteschlange kann über einem Stream implementiert werden. Dies erfolgt durch Implementieren des Nachrichtenrahmens. Beispielsweise bietet TCP eine Stream-Schnittstelle, HTTP baut auf TCP auf und fügt Nachrichtenframing mithilfe der Codierung für Inhaltslänge / Chunked-Übertragung hinzu. Benutzer einer HTTP-Verbindungs-API werden vom Aufteilen des HTTP-Verbindungsstroms auf HTTP-Anforderungen abstrahiert.

Auf der anderen Seite ist es normalerweise weniger sinnvoll, eine Stream-API über einer Warteschlange zu implementieren, da die Behandlung des Nachrichtenrahmens unnötigen Overhead verursacht.

Lie Ryan
quelle
Es lohnt sich hinzuzufügen, dass die API für die Warteschlange im Allgemeinen jeweils ein einzelnes Element erzeugt / verbraucht, während die Streaming-API im Allgemeinen mehrere "Wörter" gleichzeitig erzeugt / verbraucht. Obwohl ich zustimme, ist das definierende Merkmal, dass eine Warteschlange auf hoher Ebene und strukturiert ist, während ein Stream auf niedriger Ebene und ohne Struktur ist.
Alexey
0

In funktionalen Programmiersprachen (z. B. Scala) und möglicherweise auch in anderen Sprachen ähneln Streams eher funktionalen Listen und sind Warteschlangen. Ich sollte jedoch beachten, dass Warteschlangen tatsächlich mithilfe eines Listenpaars implementiert werden können . In Scala und wahrscheinlich auch anderswo ist ein Stream nur eine faule Liste - genauer gesagt, das Ende der Liste ist eine lazy val.

Funktionale Streams können Ähnlichkeiten mit Warteschlangen aufweisen, im Gegensatz zu Listen, da Sie sie so verwenden können, dass Sie keinen Verweis auf den Kopf des Streams behalten - aber Sie müssen vorsichtig sein: https: // stackoverflow.com/a/5159356/3096687 . Dies ist etwas analog zu einem Warteschlangenaufruf an eine Warteschlange (obwohl Sie dies im Fall eines Streams implizit tun: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).

bbarker
quelle
-1

Stream ist ein Konzept / Framework zum Erzeugen und Konsumieren einer unendlichen Folge von Daten seriell oder parallel oder in großen Mengen. Que ist eine Datenstruktur, über die Streams implementiert werden können. Genau wie list oder seq, über die Streams implementiert werden können.

user3423890
quelle