Можете ли вы объяснить концепцию потоков?

Я понимаю, что поток представляет собой представление последовательности байтов. Каждый поток предоставляет средства для чтения и записи байтов в его хранилище резервных копий. Но в чем суть потока? Почему мы не поддерживаем резервный магазин?

По какой-то причине эта концепция просто не нажимает на меня. Я прочитал кучу статей, но думаю, мне нужна аналогия или что-то в этом роде.

Ответ 1

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

Забудь о вспомогательном магазине немного, и начните думать об аналогии с потоком воды. Вы получаете непрерывный поток данных, точно так же, как вода непрерывно течет в реке. Вы не всегда знаете, откуда берутся данные, и чаще всего вам это не нужно; будь то из файла, сокета или любого другого источника, это не важно (не обязательно). Это очень похоже на получение потока воды, в котором вам не нужно знать, откуда оно; будь то озеро, фонтан или какой-либо другой источник, он не должен (не должен) действительно иметь значение.

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

int ReadInt(StreamReader reader) { return Int32.Parse(reader.ReadLine()); }

// in another method:
Stream fileStream = new FileStream("My Data.dat");
Stream zipStream = new ZipDecompressorStream(fileStream);
Stream decryptedStream = new DecryptionStream(zipStream);
StreamReader reader = new StreamReader(decryptedStream);

int x = ReadInt(reader);

Как вы видите, очень легко изменить источник ввода, не изменяя логику обработки. Например, для чтения ваших данных из сетевого сокета вместо файла:

Stream stream = new NetworkStream(mySocket);
StreamReader reader = new StreamReader(stream);
int x = ReadInt(reader);

Так легко, как может быть. И красота продолжается, так как вы можете использовать любой источник входных данных, если вы можете создать для него поточную "обертку". Вы даже можете это сделать:

public class RandomNumbersStreamReader : StreamReader {
    private Random random = new Random();

    public String ReadLine() { return random.Next().ToString(); }
}

// and to call it:
int x = ReadInt(new RandomNumbersStreamReader());

См? Пока ваш метод не заботится о том, что источник входных данных, вы можете настроить свой источник различными способами. Абстракция позволяет очень эффективно отделять входные данные от логики обработки.

Обратите внимание, что созданный нами поток не имеет хранилища резервных копий, но он по-прежнему идеально подходит для наших целей.

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

Ответ 2

Дело в том, что вам не нужно знать, что такое резервный магазин - это абстракция над ним. В самом деле, даже не может быть хранилище резервных копий - вы можете читать из сети, а данные никогда "не сохраняются".

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

Кроме того, потоки часто соединяются вместе - у вас может быть поток, который сжимает все, что помещается в него, записывая сжатую форму на другой поток или тот, который шифрует данные и т.д. На другом конце быть обратной цепью, дешифровать, декомпрессировать или что угодно.

Ответ 3

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

Ответ 4

Это не о потоках - это о плавании. Если вы можете плавать в одном потоке, вы можете плавать через любой поток, с которым вы сталкиваетесь.

Ответ 5

Чтобы добавить в эхо-камеру, поток представляет собой абстракцию, поэтому вам не нужно заботиться о базовом магазине. Это имеет наибольший смысл, когда вы рассматриваете сценарии с потоками и без них.

Файлы неинтересны по большей части, потому что потоки не намного выше и выше того, что я знаю с помощью методов, отличных от потока. Начните с интернет файлов.

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

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

Таким образом, потоки облегчают ввод/вывод. Вы могли бы, конечно, написать класс TcpFileDownloader, который делает то, что делает поток, но тогда у вас есть класс, специфичный для TCP. Большинство интерфейсов потоков просто предоставляют метод Read() и Write(), и все более сложные концепции обрабатываются внутренней реализацией. Из-за этого вы можете использовать один и тот же базовый код для чтения или записи в память, файлы дисков, сокеты и многие другие хранилища данных.

Ответ 6

Это просто концепция, еще один уровень абстракции, который облегчает вашу жизнь. И все они имеют общий интерфейс, что означает, что вы можете комбинировать их в такой же форме. Например, закодируйте на base64, затем запишите, а затем напишите это на диск и все в одной строке!

Ответ 7

Визуализация, которую я использую, - это конвейерные ленты, а не настоящие фабрики, потому что я ничего не знаю об этом, но в мультяшных фабриках, где предметы перемещаются по линиям, получают штамп и коробку, подсчитываются и проверяются последовательностью немых устройств.

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

Во-первых, это упрощает сами компоненты: если вы хотите поместить шоколадную глазурь на торт, вам не нужно сложное устройство, которое знает все о тортах, вы можете создать немое устройство, которое запивает шоколадную глазурь на все, что подается в это (в мультфильмах это доходит до того, что не зная, что следующий пункт в не торт, это Wile E. Coyote).

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

В-третьих, устройствам не требуется управлять инвентарем, боксом или распаковкой. Самый эффективный способ агрегирования и упаковки вещей изменчив: возможно, сегодня вы помещаете свои пирожные в коробки по 48 и отправляете их на грузовик, но завтра вы хотите отправить коробки из шести в ответ на заказные заказы. Такие изменения могут быть заменены путем замены или реконфигурации машин в начале и конце производственной линии; вишневая машина в середине линии не должна быть изменена для обработки различного количества элементов за раз, она всегда работает с одним элементом за раз, и ему не нужно знать, как ее вход или выход группируются.

Ответ 8

Лучшее объяснение потоков, которые я видел, это глава 3 SICP. (Возможно, вам нужно будет прочитать первые 2 главы, чтобы это имело смысл, но вы все равно должны: -)

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

  • Потоки задерживаются списками
  • Навыки вычислительных вычислений [жадно вычисляя все заблаговременно, в некоторых случаях] являются возмутительными
  • Мы можем использовать потоки для представления бесконечно длинных последовательностей

Ответ 9

В информатике поток представляет собой непрерывный поток информации.

Когда я думаю о потоковой передаче, я думаю о видео службе доставки. Хотя потоковая передача не ограничивается видео. Текстовые, аудио, zip файлы также могут быть потоковыми. Кроме того, потоковая передача не ограничена файлами. Также могут транслироваться соединения HTTP, FTP, SSH и ввод/вывод.

Чтобы понять концепцию потоковой передачи, вы можете сравнить другие концепции распространения данных.

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

Прогрессивная загрузка позволяет просматривать видеофайл по мере его загрузки. Возможна быстрая перемотка и перемотка. Для этого используется буфер, в котором хранятся данные, временные в памяти компьютера, принимающего видеофайл. Несмотря на то, что данные чередуются, это не настоящая потоковая передача.

Streaming происходит в режиме реального времени, и данные кусков. Потоковая передача осуществляется в прямом эфире. Клиенты, которые прослушивают широковещательную рассылку, не могут быстро пересылать или перематывать. В видеопотоках данные отбрасываются после воспроизведения.

Потоковый сервер поддерживает двухстороннее соединение со своим клиентом, а веб-сервер закрывает соединение после ответа сервера.

Полезные ссылки:

Ответ 10

Еще одна точка (для чтения файловой ситуации):

  • stream может позволить вам сделать что-то еще до finished reading all content of the file.
  • вы можете сохранить память, так как не нужно загружать все содержимое файла сразу.

Ответ 11

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

Ответ 12

Я думаю, вам нужно учитывать, что сам резервный магазин часто является просто абстракцией. Поток памяти довольно легко понять, но файл радикально отличается в зависимости от того, какую файловую систему вы используете, неважно, какой жесткий диск вы используете. Не все потоки на самом деле сидят поверх резервного хранилища: сетевые потоки в значительной степени являются потоками.

Точка потока - это то, что мы ограничиваем наше внимание на то, что важно. Имея стандартную абстракцию, мы можем выполнять общие операции. Даже если вы не хотите, например, искать файл или HTTP-ответ для URL-адресов сегодня, не означает, что вы не захотите завтра.

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

Ответ 13

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

Например, если вы обрабатываете данные через поток, это не имеет значения для вашего кода, если данные поступают из файла, сетевого подключения, строки, блоба в базе данных и т.д. и т.д. и т.д.

Там нет ничего плохого в взаимодействии с самим хранилищем, за исключением того факта, что он связывает вас с реализацией хранилища.

Ответ 14

Поток - это абстракция, которая предоставляет стандартный набор методов и свойств для взаимодействия с данными. Отвлекаясь от реального носителя, ваш код может быть написан без полной зависимости от того, что этот носитель является или даже реализует этот носитель.

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

Ответ 15

Я буду держать это в курсе, я просто пропустил здесь слово:

Потоки очереди обычно хранятся в буфере, содержащем любые данные.

(Теперь, поскольку все мы знаем, в каких очередях, нет необходимости объяснять это дальше.)