Jaka jest różnica między strumieniem a kolejką? Oba mają koncepcję uporządkowanego zestawu elementów, ale zwykle mają różne implementacje i inne słownictwo „wstaw” / „wyciąg” (strumienie) vs. „enqueue” / „dequeue” (kolejka). Czy są one wymienne? Czy sugerują różne koncepcje lub wzorce? Jeśli tak, jakie są różnice?
data-structures
elliot42
źródło
źródło
Odpowiedzi:
Strumień nie jest to struktura danych jako takich (koncepcyjnie), ale to sekwencja kodowanych cyfrowo spójnych sygnałów (pakietów danych lub pakietów danych) używanych do przesyłania lub odbierania informacji”. Więc w zasadzie sekwencja danych.
Kolejka jest prostym mechanizmem FIFO pozwalając na dodawanie elementów do tyłu kolejce lub wziąć od przodu.
Strumienie zawsze mają źródło, np. Plik, lokalizację sieci itp. Kolejka z natury nie zawiera żadnych danych.
Zasadniczo mają one zupełnie odmienną koncepcję i, jak zauważył Mason, są używane w inny sposób.
źródło
yes(1)
jest osadzony ciąg domyślny. Uruchom z argumentem, niezależnie od tego, który argument podał.(stream)
zwraca pusty strumień. Również ta odpowiedź jest błędna, strumień jest strukturą danych, strumienie mogą nie mieć źródła, a strumienie z natury nie zawierają żadnych danych, mogą mieć wartość zero lub zero lub pustą listę. Aby uzyskać więcej informacji, patrz SRFI-41 .Podstawowa różnica polega na sposobie ich użycia. W strumieniu zwykle używasz tylko jednej strony operacji: otwierasz strumień do odczytu lub zapisu, ale nie jedno i drugie. Podczas gdy w kolejce wkładasz i zdejmujesz przedmioty.
Ponadto kolejki są bardzo surowe w odniesieniu do kolejności, w jakiej je wkładasz i zdejmujesz, podczas gdy strumienie często (ale nie zawsze) obsługują
Seek
operację, szczególnie jeśli czytasz z nich.źródło
FileStream
można otworzyć wReadWrite
trybie.Z mojego doświadczenia wynika, że strumień jest sekwencją bajtów, które są wytwarzane / konsumowane z częstotliwością często określaną przez dane w strumieniu. Na przykład strumień danych MPEG będzie miał nagłówki ramek, które opisują, co robi kolejna sekwencja bajtów i ile trzeba zużyć. Serializacja binarna dokumentu byłaby podobna. Nie zawsze jest samoopisujące: zapis do STDOUT można wykonać w sposób strumieniowy, ale może to być dane czytelne dla człowieka / dane, których nie da się przeanalizować.
I odwrotnie, kolejka jest zwykle dobrze znanym typem obiektu (lub obiektów obsługujących interfejs), które są konsumowane w całości. Przykładem może być kolejka zadań bazy danych przetwarzanych przez wielu pracowników bazy danych.
źródło
Różnica między strumieniem a kolejką polega na sposobie kontrolowania szybkości transmisji danych:
w kolejce nadawca dostosowuje się do prędkości czytnika. Nadawca decyduje, co zrobić, gdy kolejka jest pełna: poczekaj na dostępność kolejki lub wyrzuć dane.
w strumieniu czytnik dostosowuje się do prędkości nadawcy. Czytnik decyduje, co zrobić, jeśli nowe dane dotrą, zanim stare zostaną zużyte.
Z tej perspektywy strumienie znaków, takie jak potoki Unix, nie kwalifikowałyby się jako strumienie, ale jako kolejki.
źródło
Jeśli myślimy bardziej wizualnie o tym, jak słowa są powszechnie używane , możemy uniknąć bałaganu określonych zastosowań w poszczególnych językach i implementacjach, dzięki czemu te terminy mogą w rzeczywistości coś znaczyć:
Taki jest cel tych warunków. To są metafory. (jak wszystko inne) (Cii! Zrujnujesz historię!)
źródło
Kolejka to koncepcja wyższego poziomu niż strumień. Podstawowymi elementami kolejki jest komunikat / obiekt, który jest spójną (zazwyczaj typową) strukturą danych, którą konsument może interpretować samodzielnie. Z drugiej strony, u podstawy strumienia znajdują się (zwykle o stałej wielkości) bity / bajty / znaki, które same w sobie zwykle nie mają znaczenia dla aplikacji. Sekwencja tych znaków może składać się z „wiadomości”, ale interfejs API strumienia pozostawia aplikacji dzielenie sekwencji znaków na rozsądne fragmenty.
Interfejs API Stream zwykle pozwala również na częściowe odczyty i zapisy, jeśli bufory strumienia są pełne, a druga strona nie odczytuje / nie zapisuje; aplikacje obsługujące kolejki zwykle oczekują, że kolejka zajmie się nimi wewnętrznie.
Kolejka może być zaimplementowana na szczycie strumienia, odbywa się to poprzez implementację ramkowania wiadomości. Na przykład protokół TCP zapewnia interfejs strumieniowy, protokół HTTP jest oparty na protokole TCP i dodaje ramkowanie wiadomości przy użyciu kodowania długości treści / przesyłania fragmentarycznego. Użytkownicy interfejsu API połączenia HTTP są pozbawieni możliwości radzenia sobie z podziałem strumienia połączeń HTTP na żądania HTTP.
Z drugiej strony zazwyczaj nie ma sensu implementować interfejsu API strumienia na górze kolejki, ponieważ obsługa ramkowania wiadomości powoduje niepotrzebne obciążenie.
źródło
W funkcjonalnych językach programowania (np. Scala), a może także w innych językach, strumienie są bardziej podobne do list funkcjonalnych i są kolejkami. Należy jednak zauważyć, że kolejki można faktycznie zaimplementować za pomocą pary list . W Scali i prawdopodobnie gdzie indziej Strumień jest po prostu leniwą listą - a dokładniej, jej końcem jest
lazy val
.Strumienie funkcjonalne mogą dzielić pewne podobieństwo z kolejkami, a nie z listami, dzięki czemu można ich używać w taki sposób, aby nie zachowywać odniesienia do nagłówka strumienia - ale należy zachować ostrożność: https: // stackoverflow.com/a/5159356/3096687 . Jest to nieco analogiczne do wywołania usuwania kolejki z kolejki (chociaż w przypadku strumienia robisz to domyślnie: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).
źródło
Strumień jest koncepcją / strukturą służącą do tworzenia i wykorzystywania nieskończonej sekwencji danych szeregowo lub równolegle lub masowo. Que to struktura danych, za pomocą której można wdrożyć strumień. podobnie jak lista lub sekwencja, dzięki której strumień może zostać zaimplementowany.
źródło