Jaka jest różnica między strumieniem a kolejką?

13

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?

elliot42
źródło
Najwyraźniej „strumień” odnosi się do różnych rzeczy w różnych kontekstach. Istnieją różnice w charakterystyce między strumieniem znaków a interfejsem Windows IStream w modelu COM a strumieniem zdarzeń w architekturze. Możesz wyjaśnić?
rwong
Leśnik zbiera wodę ze strumienia, ale nie zużywa całej wody. Istnieje więc poczucie, że należy zebrać pewną ilość ze strumienia, nie zużywając go całkowicie. Z drugiej strony przedmioty w kolejce mogą zostać wyczerpane.
emallove

Odpowiedzi:

11

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.

Fala upałów
źródło
W rzeczywistości istnieje struktura danych zwana „strumieniem”, z (efektywnie) listą danych do konsumpcji, z funkcją producenta na końcu, którą można wywołać, jeśli potrzebujesz więcej elementów.
Vatine
Uniksowe polecenie „tak” wygląda jak strumień, ale nie ma określonego źródła danych.
JBRWilkinson
@JBRWilkinson: Uruchom bez argumentu, źródłem danych yes(1)jest osadzony ciąg domyślny. Uruchom z argumentem, niezależnie od tego, który argument podał.
Blrfl
Tak, masz rację - wszystkie dane muszą skądś pochodzić. Być może faktem jest, że kolejka może być pusta, a strumień z definicji zwykle nie jest?
JBRWilkinson
2
@JBRWilkinson Tak nie jest. W schemacie (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 .
niania
5

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ą Seekoperację, szczególnie jeśli czytasz z nich.

Mason Wheeler
źródło
3
FileStreammożna otworzyć w ReadWritetrybie.
Robert Harvey
2
..i kolejki priorytetowe dają opcje dotyczące zamówienia
Petter Nordlander
5

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.

JBRWilkinson
źródło
5

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.

mouviciel
źródło
W adaptacyjnym przesyłaniu strumieniowym wideo serwer dostosuje się do strumienia o niższej wierności, ponieważ klient nie nadąża.
JBRWilkinson
@JBRWilkinson - W adaptacyjnym przesyłaniu strumieniowym wideo serwer wysyła po prostu wiele wariantów strumienia o różnych przepływnościach. Nadal obowiązkiem klienta jest wybranie jednego z tych strumieni.
mouviciel
Tak, strumieniowanie HTTP to robi. Miałem na myśli połączenia wideo typu punkt-punkt, a dane nie są wstępnie zakodowane. Mój zły - powinienem był powiedzieć wprost.
JBRWilkinson
Intencją strumienia znaków jest to, że dane są konsumowane mniej więcej w miarę ich produkcji: jest to raczej przepływ danych niż sposób ich przechowywania. Wiemy, że nie jest to idealne w praktyce, ale z metaforycznego punktu widzenia oczekuje się, że będzie to prawdą: czytelnik może przetwarzać strumień tak szybko, jak to możliwe.
5

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ć:

  • Kolejka ludzi czeka w kolejce i podawane są jeden po drugim. Więcej osób dołącza do kolejki na ogonie. Wszyscy czekają na zakończenie usługi, a czas usługi może się różnić. Możesz mówić o tym, ile osób jest obsługiwanych ogółem.
  • Strumień ludzi, na przykład pozostawiając budynku przez drzwi, nie są podawane, jeden po drugim, po prostu przejść do punktu wyjścia na bardziej lub mniej stałym tempie. Nie oczekuje się opóźnień i nie są one dobrze tolerowane. Możesz mówić o liczbie osób: jedna na sekundę.

Taki jest cel tych warunków. To są metafory. (jak wszystko inne) (Cii! Zrujnujesz historię!)


źródło
2

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.

Lie Ryan
źródło
Warto dodać, że API dla kolejki generuje / zużywa pojedynczy element naraz, podczas gdy API streamingu generuje / zużywa wiele „słów” jednocześnie. Chociaż zgadzam się, że cechą charakterystyczną jest to, że kolejka ma wysoki poziom i jest uporządkowana, podczas gdy strumień jest niski i nie ma struktury.
Alexey
0

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 ).

barker
źródło
-1

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.

użytkownik3423890
źródło