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?
data-structures
elliot42
quelle
quelle
Antworten:
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.
quelle
yes(1)
ist die eingebettete Standardzeichenfolge. Führen Sie mit einem Argument aus, es ist das, was das Argument geliefert hat.(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 .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
Seek
Vorgang unterstützen, insbesondere wenn Sie daraus lesen.quelle
FileStream
kann imReadWrite
Modus geöffnet werden.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.
quelle
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.
quelle
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:
Das ist die Absicht dieser Begriffe. Sie sind Metaphern. (wie alles andere) (Shhh! Du wirst die Geschichte ruinieren!)
quelle
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.
quelle
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 ).
quelle
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.
quelle