Вероятно, вы слышали о них, наверное, вы этого не сделаете. Но они были на некоторое время. Мы говорим о потоки
, интересный и часто игнорированный функционал узла. Js.
Что такое потоки?
Чтобы облегчить вещи, мы определим поток как последовательность данных, которые свободно течет
Отказ Подумайте о потоках, таких как реки. Реки текут с одной точки на другой постоянно. Приемник не знает, когда река перестанет течь, но она всегда там для получения больше воды.
В узле потоки очень похожи. Они постоянная последовательность данных. Они текут с одной точки (излучателя) к другому (приемник).
Приемник может решить, хочет ли он получать данные или нет. Также это решает, что делать с полученными данными. Это может игнорировать
Данные, трубка
Это другому приемнику, разбираться
Это до получения …
Почему Полезные ли потоки?
Это действительно хороший вопрос. Если вы жили без потоков всю свою жизнь, вы подумаете, что их не нужны. И, в зависимости от вашего случая использования, это может быть правдой.
Но реальность в том, что нам нужно использовать потоки для некоторых операций, которые в противном случае нас убьют. Давайте поставить пример
Работа с файлами
Допустим, мы хотим создать сжатую копию файла на нашем диске с приложением узла. Обычно мы окажемся с чем-то вроде этого:
fs.readFile(file, (err, buffer) => { zlib.gzip(buffer, (err, buffer) => { fs.writeFile(file + '.gz', buffer, err => { console.log('Done!!'); }); }); });
Импорт удален для краткости
Здесь мы делаем 4 вещи:
- Мы читаем Весь Файл и сохранение данных к переменной называется
буфер
- Мы используем
zlib.gip
сжать файл вГжип
Отказ Мы передаем буфер на вызов функции. Это вернет новый сжатый буфер - Мы пишем сжатый буфер в новое местоположение
- А
console.log
указание что операция закончена
Ну, это работает. В чем проблема с таким подходом? Вы можете быть интересно. Ну, посмотрите еще раз на первые 2 шага. В этом подходе мы читаем Весь файл прежде чем начать обрабатывать его. Кроме того, мы храним содержимое этого файла в памяти. Это не проблема, если размер файла находится в MB. Но если размер файла находится в порядке ГБ? Сотни ГБ? У вас будет ли ваш компьютер все, что RAM доступна для удержания файла в нем файл? Вероятно, не.
Итак, этот подход, даже когда достаточно для более простых задач, представляет проблему, когда мы ищем производительность и масштабируемость, или просто мы хотим поддерживать большие файлы.
Проблема может быть решена с помощью поток
. Давайте посмотрим, как:
fs.createReadStream(file) .pipe(zlib.createGzip()) .pipe(fs.createWriteStream(file + '.gz')) .on('finish', () => console.log('wooh!'));
Мы делаем некоторые вещи здесь разными:
- Мы создаем
Читать поток
Отказ Это вернет наскуски
файла, пока он не достигнет конца. - Мы
Трубопровод
куски наZlib
для сжатия. Здесь важно то, что мы не ждем, пока весь файл будет читать перед запуском сжатия. - Мы создаем
Написать поток
в котором мы проезжаемкуски
данных, поэтому узел может написать их в файл. - В конце концов, мы слушаем
Готово
Событие, которое будет вызвать, когда нечего делать.
Существует огромный набор деталей и quirks & Functions, связанные с потоками, которые будут покрыты в других постах в блоге.
Надеюсь, тебе понравилось!
Оригинал: “https://dev.to/kaleman15/the-beauty-of-streams-in-node-28d”