Вероятно, вы слышали о них, наверное, вы этого не сделаете. Но они были на некоторое время. Мы говорим о потоки , интересный и часто игнорированный функционал узла. 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”