В чем разница между потоком и очередью? Они оба имеют концепцию упорядоченного набора элементов, но, как правило, имеют разные реализации и разные словари «вставка» / «извлечение» (потоки) и «добавление в очередь» / «извлечение» (очередь). Они взаимозаменяемы? Они предлагают разные концепции или модели? Если так, то в чем различия?
data-structures
elliot42
источник
источник
Ответы:
Поток в действительности не является структурой данных как таковой (концептуально), но представляет собой последовательность кодированных в цифровом виде когерентных сигналов (пакетов данных или пакетов данных) , которые используются для передачи или приема информации». Таким образом , в основном последовательность данных.
Очередь представляет собой простой механизм FIFO позволяет добавлять элементы в задней части очереди или взять с фронта.
У потоков всегда есть источник, например, файл, местоположение в сети и т. Д. Очередь по своей природе не содержит никаких данных.
По сути, они совершенно разные по концепции, и, как указал Мейсон, они используются по-разному.
источник
yes(1)
является встроенная строка по умолчанию. Запустите с аргументом, это то, что предоставило аргумент.(stream)
возвращает пустой поток. Кроме того, этот ответ неверен, поток - это структура данных, потоки могут не иметь источника, а потоки по своей природе не содержат никаких данных, они могут быть нулевыми или нулевыми или пустым списком. См. SRFI-41 для получения дополнительной информации.Основное различие заключается в том, как они используются. В потоке вы обычно используете только одну сторону операции: вы открываете поток для чтения или записи, но не одновременно. В то время как с очередью вы надеваете предметы и снимаете их.
Кроме того, очереди очень строги относительно порядка, в котором вы помещаете вещи и снимаете их, в то время как потоки часто (но не всегда) поддерживают
Seek
операцию, особенно если вы читаете из них.источник
FileStream
можно открыть вReadWrite
режиме.По моему опыту, поток - это последовательность байтов, которые производятся / потребляются со скоростью, часто определяемой данными в потоке. Например, поток данных MPEG будет иметь заголовки кадров, которые описывают, что делает следующая последовательность байтов и сколько нужно использовать. Двоичная сериализация документа будет аналогичной. Это не всегда самоописание: запись в STDOUT может выполняться потоковым способом, но это могут быть читаемые человеком / не разбираемые данные.
И наоборот, очередь обычно относится к объекту хорошо известного типа (или объектам, поддерживающим интерфейс), которые потребляются полностью. Примером может служить очередь заданий базы данных, которые обрабатываются несколькими работниками базы данных.
источник
Разница между потоком и очередью заключается в способе управления скоростью передачи данных:
в очереди отправитель адаптируется к скорости чтения. Отправитель решает, что делать, если очередь заполнена: дождаться доступности очереди или выбросить данные.
в потоке считыватель адаптируется к скорости отправителя. считыватель решает, что делать, если новые данные поступают до того, как будут использованы старые.
С этой точки зрения символьные потоки, такие как конвейеры Unix, будут рассматриваться не как потоки, а как очереди.
источник
Если мы более наглядно подумаем о том, как эти слова обычно используются , мы можем избежать путаницы специфического использования конкретными языками и реализациями, так что эти термины могут действительно что-то значить:
Это намерение этих условий. Это метафоры. (как и все остальное) (Тссс! Ты испортишь историю!)
источник
Очередь - это концепция более высокого уровня, чем поток. Базовыми элементами очереди является сообщение / объект, который представляет собой согласованную (обычно типизированную) структуру данных, которая может быть интерпретирована потребителем самостоятельно. С другой стороны, в основе потока есть биты / байты / символы (обычно фиксированного размера), что само по себе обычно бессмысленно для приложения. Последовательность этих символов может составлять «сообщение», но потоковый API оставляет его приложению, чтобы разделить последовательность символов на разумные куски.
Stream API обычно также позволяет частичное чтение и запись, если потоковые буферы заполнены, а другая сторона не выполняет чтение / запись; приложения, обрабатывающие очереди, обычно ожидают, что очередь обработает их внутренне.
Очередь может быть реализована поверх потока, это осуществляется с помощью кадрирования сообщений. Например, TCP предоставляет потоковый интерфейс, HTTP построен поверх TCP и добавляет кадрирование сообщений с использованием Content-Length / chunked Transfer Encoding. Пользователи API-интерфейса HTTP-соединения абстрагируются от разделения потока HTTP-соединения на HTTP-запросы.
С другой стороны, обычно не имеет смысла реализовывать потоковый API поверх очереди, так как обработка кадров сообщения добавляет ненужные накладные расходы.
источник
В функциональных языках программирования (например, Scala) и, возможно, в других языках потоки действительно больше похожи на функциональные списки и представляют собой очереди. Однако следует отметить, что очереди могут быть реализованы с использованием пары списков . В Scala и, возможно, в других местах Stream - это просто ленивый список, точнее, хвост списка
lazy val
.Функциональные потоки могут иметь некоторое сходство с очередями, в отличие от списков, в том смысле, что вы можете использовать их таким образом, чтобы не хранить ссылку на начало потока, но вы должны быть осторожны: https: // stackoverflow.com/a/5159356/3096687 . Это несколько похоже на вызов очереди в очередь (хотя в случае с потоком вы делаете это неявно: http://daily-scala.blogspot.com/2010/01/streams-2-stream-construction.html ).
источник
Поток - это концепция / структура, позволяющая производить и использовать бесконечную последовательность данных последовательно, параллельно или в объеме. Que - это структура данных, с помощью которой можно реализовать поток. так же, как list или seq, через который можно реализовать поток.
источник