Nodejs - очень популярная среда выполнения javascript, известная своей асинхронной природой и разработкой приложений на стороне сервера. Он имеет много основных модулей или, скажем, парадигм, которые еще недостаточно изучены и используются в каждом приложении (звучит немного запутанно, правда?). Одним из таких основных модулей является Stream.

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

Одним из таких модулей, который позволяет нам обрабатывать поток данных, будь то двоичный или объектный, асинхронно, является Stream.

Начнем с обсуждения двух подходов к обработке данных, предлагаемых nodejs.

  1. Буферизованный подход:

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

2. Потоковый подход:

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

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

Эффективность времени

Есть одно отличное поведение потоков, и это конвейерная обработка, в основном вы можете передать два потока, где вывод одного потока является входом для другого. Происходит то, что «данные» (фрагмент) поступают в «поток 1», который передается по конвейеру
«потоку 2», который в дальнейшем может быть передан другим потокам. Таким образом, данные продолжают передаваться между потоками. Говоря о эффективности времени! Давайте посмотрим на это на примере:

У вас есть данные, поступающие из сокета TCP, и все эти данные, которые вы хотите записать в файл. Итак, у нас есть два потока, 1 для сокета TCP, который является нашим входной поток, а другой поток для файла поток 1 передан в поток 2. Думайте об этих потоках как об этапах 1 и 2. Итак, что произойдет,

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

Пространственная эффективность

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

Предположим, мы хотим прочитать файл размером 20 МБ и отобразить его содержимое на терминале, но размер буфера составляет всего 16 МБ, поэтому произойдет утечка, как только мы начнем читать файл. На помощь приходят потоки!
Чтобы предотвратить подобную ситуацию, создайте читаемый поток (мы обсудим это в следующих разделах) для файла, чтобы Как только некоторые данные будут считаны из файла, вы можете получить их из буфера, отобразить и очистить буфер. Таким образом мы можем предотвратить утечку нашего буфера. Это пример Пространственной эффективности с потоками.

Сочетаемость

Это свойство снова связано с поведением потоков по конвейеру. Поскольку вы можете направлять один поток в другой, независимо от того, сколько потоков у вас есть, это приводит к компоновке. Независимо от того, к чему привязан ваш поток, вы можете направить один вход (Readable Stream) в выходной (Writable Stream), и это может продолжаться. Существует один Duplex Stream, который ведет себя как оба Читаемые и записываемые потоки. С помощью этого потока вы можете передавать несколько потоков по конвейеру.

Пример:

Типы потоков

  1. Читаемые потоки: эти потоки позволяют читать данные из источника.
  2. Записываемые потоки: эти потоки позволяют записывать данные в место назначения.
  3. Дуплексные потоки. Эти потоки представляют собой гибрид доступных для чтения и записи потоков.

Примечание. Это 3 основных типа потоков. Существуют и другие потоки, такие как Transform Stream и т. д. , который является расширением Дуплексный поток.
В этой статье мы обсудим читаемые и записываемые потоки.

Реализация записываемого потока

Реализация читаемого потока

Примечание.
Вы можете попробовать приведенные выше примеры, чтобы лучше понять, как работают потоки.

Заключение:

Потоки очень полезны как с точки зрения чистого кода, так и с точки зрения эффективности. Если кто-то понимает поток данных при использовании потоков, намного проще управлять всем приложением с точки зрения данных, потому что вам не нужно беспокоиться о создании переменных в памяти, определите явные методы чтения / записи, push / pull по порядку для управления потоком данных.

Для получения дополнительной информации о потоке я бы порекомендовал официальные документы `nodejs`:
https://nodejs.org/api/stream.html

✉️ Подпишитесь на рассылку еженедельно Email Blast 🐦 Подпишитесь на CodeBurst на Twitter , просмотрите 🗺️ План развития веб-разработчиков на 2018 год и 🕸️ Изучите веб-разработку с полным стеком .