Этот рассказ изначально был опубликован здесь.

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

Потоки в Node.js

Это первая статья из серии о потоках в Node.js. Его цель - дать обзор различных типов потоков и их ограничений, преимуществ и вариантов использования.

Потоки в Node.js

  • Что такое поток в Node.js? (эта статья)
  • Соединение ручьев трубным методом (планируется)
  • Обработка ошибок потока (планируется)
  • Подключить потоки конвейерным методом (планируется)

Что такое потоки?

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

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

Зачем нужны потоки?

Потоки позволяют нам работать с данными, размер которых слишком велик для размещения в памяти. Мы можем работать с фрагментами данных за раз. Например, вы работаете с файлом аналитических данных размером 50 ГБ с миллионами строк. Если вы прочитаете этот файл в память, это займет очень много времени и в конечном итоге достигнет предела памяти Node.js или вашей локальной машины. Обрабатывая этот файл с потоком, мы можем обрабатывать каждую строку из набора данных за раз, и нам не нужно читать файл в память. Следовательно, потоки эффективно используют память.

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

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

Типы потоков

Во встроенном модуле stream Node.js. есть 5 типов потоков. Документы

  • Читаемый: вы получаете данные из читаемого потока.
  • Доступен для записи: вы передаете данные в поток с возможностью записи. Также называется стоком, потому что это конечный пункт назначения потоковой передачи данных.
  • Дуплекс: дуплексный поток реализует оба интерфейса - с возможностью чтения и записи. Примером дуплексного потока является TCP-сокет, по которому данные передаются в обоих направлениях.
  • Преобразование: поток преобразования - это тип дуплексного потока, в котором данные преобразуются. Таким образом, вывод будет отличаться от ввода. Данные можно отправить в поток преобразования и прочитать после преобразования.
  • PassThrough: сквозной поток является потоком Transform, но не преобразует данные при передаче. В основном он используется для тестирования и примеров.

Вне дикой природы высока вероятность того, что вы встретите потоки readable, writeable и transform.

События потоковой передачи

Все потоки являются экземплярами EventEmitter. EventEmitters используются для генерации событий и асинхронного ответа на них. Подробнее о EventEmitters читайте в статье Event Emitters в Node.js. События, создаваемые потоками, могут использоваться для чтения и / или записи данных, управления состоянием потока и обработки ошибок.

Хотя потоки являются экземплярами EventEmitter, не рекомендуется обрабатывать потоки как события и просто слушать события. Вместо этого рекомендуется использовать методы pipe и pipeline, которые потребляют потоки и обрабатывают события за вас.

Работа с событиями потока полезна, когда требуется более контролируемый способ использования потока. Например, запуск события, когда определенный поток заканчивается или начинается. Взгляните на официальную документацию Node.js по Streams для получения дополнительной информации об этом.

Читаемые события потока

  • data - генерируется, когда поток выводит блок данных.
  • readable - генерируется, когда есть данные, готовые к чтению из потока.
  • end - выдается, когда больше нет данных.
  • error - генерируется, когда в потоке произошла ошибка, и объект ошибки передается обработчику. Необработанные ошибки потока могут привести к сбою приложения.

Доступные для записи события потока

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

TL;DR

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

Благодарим за прочтение. Если у вас есть вопросы, используйте функцию комментариев или отправьте мне сообщение @mariokandut .

Если вы хотите узнать больше о Узле, ознакомьтесь с этими Руководствами по узлам.

Ссылки (и большое спасибо):

HeyNode, Node.js - потоки, MDN - поток с возможностью записи, MDN - потоки