Яка різниця між потоком і чергою?


13

Яка різниця між потоком і чергою? Вони обидва мають концепцію впорядкованого набору елементів, але, як правило, мають різні реалізації та різну лексику "вставити" / "витягнути" (потоки) порівняно з "enqueue" / "dequeue" (черга). Ці взаємозамінні? Вони пропонують різні концепції чи зразки? Якщо так, то які відмінності?


Мабуть, "потік" позначає різні речі в різних контекстах. Існують відмінності в характеристиках між символьним потоком проти Windows IStream інтерфейсом в COM та потоці подій в архітектурі говорять. Ви можете уточнити?
rwong

Лісовик збирає трохи води з потоку, але всю воду вони не споживають . Отже, є сенс збирати суму з потоку, не витрачаючи його повністю. З іншого боку, елементи в черзі можуть бути вичерпані.
emallove

Відповіді:


11

Потік в дійсності не є структурою даних як такої (концептуально), але являє собою послідовність кодованих в цифровому вигляді когерентних сигналів (пакетів даних або пакетів даних) , які використовуються для передачі або прийому інформації ». Таким чином , в основному послідовність даних.

Черга є простий механізм FIFO дозволяє додавати елементи в задній частині черзі або взяти з фронту.

У потоків завжди є джерело, наприклад файл, мережеве розташування тощо. Черга по суті не містить жодних даних.

Отже, вони принципово різняться, і, як зазначав Мейсон, вони використовуються по-різному.


Насправді існує структура даних під назвою "потік" з (ефективно) переліком даних, які потрібно споживати, з функцією виробника на своєму хвості, для виклику, якщо вам потрібно більше елементів.
Ватін

Команда Unix "так" схожа на потік, але не має конкретного джерела даних.
JBRWilkinson

@JBRWilkinson: Запустити без аргументу, джерелом даних yes(1)є вбудована рядок за замовчуванням. Виконати з аргументом, це все, що надало аргумент.
Blrfl

Так, ви маєте рацію - всі дані мають звідкись надходити. Можливо, справжнє значення полягає в тому, що черга може бути порожньою, а потік, за визначенням, зазвичай не є?
JBRWilkinson

2
@JBRWilkinson Це не так. У схемі (stream)повертає порожній потік. Крім того, ця відповідь неправильна, потік - це структура даних, потоки можуть не мати джерела, а потоки не містять ніяких даних, вони можуть бути нульовими або нульовими або порожнім списком. Див. SRFI-41 для отримання додаткової інформації.
няня

5

Основна відмінність полягає у способі їх використання. У потоці зазвичай використовується лише одна сторона операції: ви відкриваєте потік для читання чи запису, але не обидва. Тоді як у черзі ви ставите предмети та знімаєте їх.

Крім того, черги дуже суворі щодо того, в якому порядку ви ставите речі та знімаєте їх, тоді як потоки часто (але не завжди) підтримують Seekоперацію, особливо якщо ви читаєте з них.


3
FileStreamможна відкрити в ReadWriteрежимі.
Роберт Харві

2
..і пріоритетні черги дають параметри щодо замовлення
Petter Nordlander

5

На мій досвід, потік - це послідовність байтів, які виробляються / споживаються зі швидкістю, часто визначається даними всередині потоку. Наприклад, потік даних MPEG матиме заголовки кадрів, які описують, що робить наступна послідовність байтів і скільки потрібно споживати. Бінарна серіалізація документа була б подібною. Це не завжди самоописується: запис до STDOUT може здійснюватися в потоковому режимі, але це можуть бути людські читані / нерозбірливі дані.

І навпаки, черга - це звичайно відомий тип об'єктів (або підтримуючих інтерфейс) об'єктів, які споживаються в повному обсязі. Прикладом може бути черга завдань із бази даних, які обробляються рядом працівників бази даних.


5

Різниця між потоком і чергою - це спосіб управління швидкістю передачі даних:

  • у черзі відправник адаптується до швидкості зчитування. Відправник вирішує, що робити, якщо черга заповнена: дочекайтеся наявності черги або викиньте дані.

  • у потоці зчитувач адаптується до швидкості відправника. Читач вирішує, що робити, якщо нові дані надходять до того, як будуть використані старі.

З цієї точки зору, потоки символів, такі як труби Unix, не кваліфікуються як потоки, а як черги.


У адаптивному потоковому відео сервер підлаштовується до потоку нижчої точності, оскільки клієнт не йде в ногу.
JBRWilkinson

@JBRWilkinson - У адаптаційному потоковому відео сервер просто надсилає кілька варіантів потоку з різною швидкістю передачі бітів. Це все ще є обов'язком клієнта вибирати серед цих потоків.
mouviciel

Так, потокова передача HTTP робить це. Я мав на увазі відеодзвінки, які є точковими та дані не заздалегідь кодуються. Моє погано - я мав би бути явним.
JBRWilkinson

Метою потоку символів є те, що дані споживаються більш-менш у міру їх отримання: це потік даних, а не засіб їх зберігання. Ми знаємо, що це не ідеально на практиці, але, з метафоричної точки зору, очікується, що це правда: читач може обробляти потік так само швидко, як і входить.

5

Якщо ми більш візуально подумаємо про те, як слова вживаються , ми можемо уникнути сукупності конкретних вживань певними мовами та реалізаціями, щоб ці терміни насправді щось означали:

  • Черги очікування людей в черзі і обслуговуються по одному. Більше людей приєднується до черги в хвіст. Усі чекають, коли триває обслуговування, і очікується, що час обслуговування буде різним. Ви можете говорити про те, скільки людей обслуговують загалом.
  • Потік людей, наприклад , виходячи з будівлі через двері, не служив один за іншим, вони просто проходять точку виходу на більш-менш постійною швидкістю. Затримки не очікуються і не переносяться добре. Можна говорити про норму людей: один за секунду.

Такий намір цих умов. Вони - метафори. (як і все інше) (Shhh! ти зіпсуєш історію!)


2

Черга - це концепція вищого рівня, ніж потік. Основними елементами черги є повідомлення / об’єкт, який є цілісною (зазвичай набирається) структурою даних, яку споживач може інтерпретувати самостійно. З іншого боку, в основі потоку є (зазвичай фіксованого розміру) біти / байти / символи, які самі по собі, як правило, безглузді для програми. Послідовність цих символів може складати "повідомлення", але API потоку залишає його програмі, щоб розділити послідовність символів на чутливі фрагменти.

API Stream зазвичай також дозволяє частково читати і записувати, якщо буфери потоків заповнені, а інша сторона не читає / записує; програми, які обробляють черги, зазвичай очікують, що чергу буде їх обробляти внутрішньо.

Черга може бути реалізована над потоком, це робиться шляхом запровадження обрамлення повідомлень. Наприклад, TCP надає потоковий інтерфейс, HTTP побудований поверх TCP і додає обрамлення повідомлень за допомогою кодування передачі вмісту / довжини вмісту. Користувачі API HTTP Connection абстрагуються від розбиття потоку HTTP-з'єднання на HTTP-запити.

З іншого боку, зазвичай, має менший сенс впроваджувати API потоку поверх черги, оскільки обробка кадрів з повідомленнями додає зайві накладні витрати.


Варто додати, що API для черги, як правило, виробляє / споживає один елемент одночасно, тоді як API потокової передачі загалом виробляє / споживає кілька "слів" одночасно. Хоча я погоджуюся, що визначальною характеристикою є те, що черга високого рівня та структурована, тоді як потік - низький і без структури.
Олексій

0

У функціональних мовах програмування (наприклад, Scala), а може бути й інших мовах, потоки справді більше схожі на функціональні списки, і вони стоять у черзі. Хочу зазначити, проте черги можуть бути реалізовані за допомогою пари списків . У Скалі та, ймовірно, в інших місцях, Потік - це лише лінивий список - точніше, хвіст списку - це lazy val.

Функціональні потоки можуть поділяти певну схожість з чергами, на відміну від списків, завдяки чому ви можете використовувати їх таким чином, щоб не зберігати посилання на голову потоку - але ви повинні бути обережними: https: // stackoverflow.com/a/5159356/3096687 . Це дещо аналогічно виклику вимкнення черги (хоча у випадку потоку ви робите це неявно: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).


-1

Потік - це концепція / рамка для створення та споживання нескінченної послідовності даних послідовно, паралельно чи масово. Que - структура даних, за допомогою якої можна реалізувати потік. так само, як список або послідовність, через які можна реалізувати потік.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.