В чем разница между потоком и очередью?

13

В чем разница между потоком и очередью? Они оба имеют концепцию упорядоченного набора элементов, но, как правило, имеют разные реализации и разные словари «вставка» / «извлечение» (потоки) и «добавление в очередь» / «извлечение» (очередь). Они взаимозаменяемы? Они предлагают разные концепции или модели? Если так, то в чем различия?

elliot42
источник
Видимо, «поток» относится к разным вещам в разных контекстах. Существуют различия в характеристиках между потоком символов и интерфейсом Windows IStream в COM и потоком событий в архитектуре. Вы можете уточнить?
Руонг
Лесник собирает воду из ручья, но они не потребляют всю воду. Таким образом, есть смысл собирать сумму из потока, не потребляя ее полностью. С другой стороны, элементы в очереди могут быть исчерпаны.
Emallove

Ответы:

11

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

Очередь представляет собой простой механизм FIFO позволяет добавлять элементы в задней части очереди или взять с фронта.

У потоков всегда есть источник, например, файл, местоположение в сети и т. Д. Очередь по своей природе не содержит никаких данных.

По сути, они совершенно разные по концепции, и, как указал Мейсон, они используются по-разному.

Heatwave
источник
На самом деле существует структура данных, называемая «поток», с (эффективно) списком данных для использования, с функцией производителя в конце, которая может вызываться, если вам нужно больше элементов.
Ватин
Unix-команда yes выглядит как поток, но не имеет определенного источника данных.
Дж.Б. Уилкинсон
@JBRWilkinson: Запустить без аргумента, источником данных yes(1)является встроенная строка по умолчанию. Запустите с аргументом, это то, что предоставило аргумент.
Blrfl
Да, вы правы - все данные должны откуда-то приходить. Возможно, фактический момент здесь в том, что очередь может быть пустой, а поток, по определению, обычно нет?
JBRWilkinson
2
@JBRWilkinson Это не тот случай. В схеме (stream)возвращает пустой поток. Кроме того, этот ответ неверен, поток - это структура данных, потоки могут не иметь источника, а потоки по своей природе не содержат никаких данных, они могут быть нулевыми или нулевыми или пустым списком. См. SRFI-41 для получения дополнительной информации.
няня
5

Основное различие заключается в том, как они используются. В потоке вы обычно используете только одну сторону операции: вы открываете поток для чтения или записи, но не одновременно. В то время как с очередью вы надеваете предметы и снимаете их.

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

Мейсон Уилер
источник
3
FileStreamможно открыть в ReadWriteрежиме.
Роберт Харви
2
..и приоритетные очереди дают варианты о заказе
Петтер Нордландер
5

По моему опыту, поток - это последовательность байтов, которые производятся / потребляются со скоростью, часто определяемой данными в потоке. Например, поток данных MPEG будет иметь заголовки кадров, которые описывают, что делает следующая последовательность байтов и сколько нужно использовать. Двоичная сериализация документа будет аналогичной. Это не всегда самоописание: запись в STDOUT может выполняться потоковым способом, но это могут быть читаемые человеком / не разбираемые данные.

И наоборот, очередь обычно относится к объекту хорошо известного типа (или объектам, поддерживающим интерфейс), которые потребляются полностью. Примером может служить очередь заданий базы данных, которые обрабатываются несколькими работниками базы данных.

JBRWilkinson
источник
5

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

  • в очереди отправитель адаптируется к скорости чтения. Отправитель решает, что делать, если очередь заполнена: дождаться доступности очереди или выбросить данные.

  • в потоке считыватель адаптируется к скорости отправителя. считыватель решает, что делать, если новые данные поступают до того, как будут использованы старые.

С этой точки зрения символьные потоки, такие как конвейеры Unix, будут рассматриваться не как потоки, а как очереди.

mouviciel
источник
При адаптивной потоковой передаче видео сервер адаптируется к потоку с более низкой точностью, потому что клиент не успевает.
Дж.Б. Уилкинсон
@JBRWilkinson - При адаптивной потоковой передаче видео сервер просто отправляет несколько вариантов потока с разными битрейтами. Это все еще является обязанностью клиента, чтобы выбрать среди этих потоков.
Mouviciel
Да, потоковая передача HTTP делает это. Я имел в виду видеовызовы, которые являются двухточечными, а данные предварительно не закодированы. Мой плохой - я должен был быть откровенным.
Дж
Смысл символьного потока состоит в том, что данные потребляются более или менее по мере их производства: это поток данных, а не средство их хранения. Мы знаем, что это не идеально на практике, но с метафорической точки зрения ожидается, что это будет правдой: читатель может обрабатывать поток так же быстро, как он поступает.
5

Если мы более наглядно подумаем о том, как эти слова обычно используются , мы можем избежать путаницы специфического использования конкретными языками и реализациями, так что эти термины могут действительно что-то значить:

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

Это намерение этих условий. Это метафоры. (как и все остальное) (Тссс! Ты испортишь историю!)


источник
2

Очередь - это концепция более высокого уровня, чем поток. Базовыми элементами очереди является сообщение / объект, который представляет собой согласованную (обычно типизированную) структуру данных, которая может быть интерпретирована потребителем самостоятельно. С другой стороны, в основе потока есть биты / байты / символы (обычно фиксированного размера), что само по себе обычно бессмысленно для приложения. Последовательность этих символов может составлять «сообщение», но потоковый API оставляет его приложению, чтобы разделить последовательность символов на разумные куски.

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

Очередь может быть реализована поверх потока, это осуществляется с помощью кадрирования сообщений. Например, TCP предоставляет потоковый интерфейс, HTTP построен поверх TCP и добавляет кадрирование сообщений с использованием Content-Length / chunked Transfer Encoding. Пользователи API-интерфейса HTTP-соединения абстрагируются от разделения потока HTTP-соединения на HTTP-запросы.

С другой стороны, обычно не имеет смысла реализовывать потоковый API поверх очереди, так как обработка кадров сообщения добавляет ненужные накладные расходы.

Ли Райан
источник
Стоит добавить, что API для очереди обычно производит / потребляет один элемент за раз, в то время как потоковый API обычно производит / потребляет несколько «слов» одновременно. Хотя я согласен, что определяющей характеристикой является то, что очередь высокого уровня и структурирована, а поток - низкого уровня и без структуры.
Алексей
0

В функциональных языках программирования (например, Scala) и, возможно, в других языках потоки действительно больше похожи на функциональные списки и представляют собой очереди. Однако следует отметить, что очереди могут быть реализованы с использованием пары списков . В Scala и, возможно, в других местах Stream - это просто ленивый список, точнее, хвост списка lazy val.

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

bbarker
источник
-1

Поток - это концепция / структура, позволяющая производить и использовать бесконечную последовательность данных последовательно, параллельно или в объеме. Que - это структура данных, с помощью которой можно реализовать поток. так же, как list или seq, через который можно реализовать поток.

user3423890
источник