Рубрики
Без рубрики

Красота ручьев в узле

Вероятно, вы слышали о них, наверное, вы этого не сделаете. Но они были на некоторое время. Мы талым … Теги с узлом, WebDev, начинающими, JavaScript.

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

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

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

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

Приемник может решить, хочет ли он получать данные или нет. Также это решает, что делать с полученными данными. Это может игнорировать Данные, трубка Это другому приемнику, разбираться Это до получения …

Почему Полезные ли потоки?

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

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

Работа с файлами

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

fs.readFile(file, (err, buffer) => {
  zlib.gzip(buffer, (err, buffer) => {
    fs.writeFile(file + '.gz', buffer, err => {
      console.log('Done!!');
    });
  });
});

Импорт удален для краткости

Здесь мы делаем 4 вещи:

  1. Мы читаем Весь Файл и сохранение данных к переменной называется буфер
  2. Мы используем zlib.gip сжать файл в Гжип Отказ Мы передаем буфер на вызов функции. Это вернет новый сжатый буфер
  3. Мы пишем сжатый буфер в новое местоположение
  4. А console.log указание что операция закончена

Ну, это работает. В чем проблема с таким подходом? Вы можете быть интересно. Ну, посмотрите еще раз на первые 2 шага. В этом подходе мы читаем Весь файл прежде чем начать обрабатывать его. Кроме того, мы храним содержимое этого файла в памяти. Это не проблема, если размер файла находится в MB. Но если размер файла находится в порядке ГБ? Сотни ГБ? У вас будет ли ваш компьютер все, что RAM доступна для удержания файла в нем файл? Вероятно, не.

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

Проблема может быть решена с помощью поток . Давайте посмотрим, как:

fs.createReadStream(file)
  .pipe(zlib.createGzip())
  .pipe(fs.createWriteStream(file + '.gz'))
  .on('finish', () => console.log('wooh!'));

Мы делаем некоторые вещи здесь разными:

  1. Мы создаем Читать поток Отказ Это вернет нас куски файла, пока он не достигнет конца.
  2. Мы Трубопровод куски на Zlib для сжатия. Здесь важно то, что мы не ждем, пока весь файл будет читать перед запуском сжатия.
  3. Мы создаем Написать поток в котором мы проезжаем куски данных, поэтому узел может написать их в файл.
  4. В конце концов, мы слушаем Готово Событие, которое будет вызвать, когда нечего делать.

Существует огромный набор деталей и quirks & Functions, связанные с потоками, которые будут покрыты в других постах в блоге.

Надеюсь, тебе понравилось!

Оригинал: “https://dev.to/kaleman15/the-beauty-of-streams-in-node-28d”