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

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

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

Представьте, что у вас есть тяжелый файл, скажем, 5 ГБ, и вы хотите прочитать этот файл и внести соответствующие изменения. Вы не хотите долго ждать, пока действительно сможете выполнить обработку. Что вы будете делать, вы используете потоки.

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

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

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

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

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

Существует несколько ключевых характеристик потоков:

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

В компьютерных системах существует множество типов потоков, включая файловые потоки, сетевые потоки и потоки памяти. Файловые потоки позволяют читать и записывать данные в файлы и из файлов на устройстве хранения. Сетевые потоки позволяют читать и записывать данные через сетевое соединение. Потоки памяти позволяют читать и записывать данные в буфер памяти и из него.

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

Существует несколько различных типов потоков, которые можно использовать в компьютерных системах, в том числе:

  • Потоки байтов. Потоки байтов — это потоки, передающие данные в виде байтов, которые являются основной единицей данных в компьютерной системе. Потоки байтов являются наиболее универсальным типом потоков и могут использоваться для передачи данных любого типа.
const fs = require('fs');

// Create a readable stream to read data from a file
const reader = fs.createReadStream('input.txt');

// Create a writable stream to write data to a file
const writer = fs.createWriteStream('output.txt');

// Pipe the data from the input file to the output file
reader.pipe(writer);
  • Потоки символов. Потоки символов — это потоки, передающие данные в виде символов, которые используются для представления текста. Потоки символов часто используются для работы с текстовыми данными и могут автоматически обрабатывать такие задачи, как кодирование и декодирование символов.
const fs = require('fs');

// Create a readable stream to read data from a file
const reader = fs.createReadStream('input.txt', { encoding: 'utf8' });

// Create a writable stream to write data to a file
const writer = fs.createWriteStream('output.txt', { encoding: 'utf8' });

// Pipe the data from the input file to the output file
reader.pipe(writer);
  • Буферизованные потоки. Буферизованные потоки — это потоки, использующие буфер для временного хранения данных с целью повышения эффективности передачи данных. Буферизованные потоки могут уменьшить количество выполняемых операций чтения и записи и повысить производительность системы.
const fs = require('fs');
const { Transform } = require('stream');

// Create a transform stream that uses a buffer to improve performance
const transformer = new Transform({
  transform(chunk, encoding, callback) {
    // Process the data in the chunk
    // ...
    callback(null, chunk);
  }
});

// Create a readable stream to read data from a file
const reader = fs.createReadStream('input.txt');

// Create a writable stream to write data to a file
const writer = fs.createWriteStream('output.txt');

// Pipe the data through the transform stream
reader.pipe(transformer).pipe(writer);
  • Отфильтрованные потоки. Отфильтрованные потоки — это потоки, которые применяют преобразование к передаваемым данным. Отфильтрованные потоки можно использовать для выполнения таких задач, как сжатие, шифрование и дешифрование.
const fs = require('fs');
const zlib = require('zlib');

// Create a readable stream to read data from a file
const reader = fs.createReadStream('input.txt');

// Create a writable stream to write data to a file
const writer = fs.createWriteStream('output.txt');

// Create a transform stream to compress the data as it is being transferred
const compressor = zlib.createGzip();

// Pipe the data through the transform stream
reader.pipe(compressor).pipe(writer);
  • Потоки объектов. Потоки объектов — это потоки, которые передают данные в виде объектов, представляющих собой сложные структуры данных, которые могут содержать различные типы данных. Потоки объектов можно использовать для передачи объектов между различными частями системы или между системами.
const fs = require('fs');
const { PassThrough } = require('stream');

// Create an object to be transferred
const data = {
  name: 'John Smith',
  age: 30
};

// Create a pass-through stream to transfer the object
const stream = new PassThrough();

// Write the object to the stream
stream.end(JSON.stringify(data));

// Create a writable stream to write the data to a file
const writer = fs.createWriteStream('output.txt');

// Pipe the data from the pass-through stream to the output file
stream.pipe(writer);
  • Параллельная обработка:этопозволяет создать конвейер потоков, которые можно использовать для параллельной обработки данных.
const fs = require("fs");
const { pipeline } = require("stream");
const { Transform } = require("stream");

// Create a transform stream that processes data in parallel
const transformer = new Transform({
  parallel: 4, // Set the number of parallel workers to 4
  transform(chunk, encoding, callback) {
    // Process the data chunk and pass it on to the next stream
    this.push(chunk.toString().toUpperCase());
    callback();
  },
});

// Create a writable stream to write the transformed data to a file
const writer = fs.createWriteStream("sample_files/output.txt", { flags: "a" });

// Pipe the data from the readable stream through the transform stream and into the write stream
pipeline(
  fs.createReadStream("sample_files/input.txt"),
  transformer,
  writer,
  (err) => {
    if (err) {
      console.error("Pipeline failed.", err);
    } else {
      console.log("Pipeline succeeded.");
    }
  }
);

Некоторые примеры того, как YouTube использует потоки, включают:

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

В целом YouTube использует потоки для эффективной доставки широкого спектра контента пользователям в режиме реального времени, что позволяет пользователям смотреть и слушать контент по мере его появления.

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

Я надеюсь, что это дало вам представление о том, как можно использовать потоки. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы или если вам нужна дополнительная помощь.

Если вам нравится этот блог и вы хотели бы прочитать о нем больше, ознакомьтесь с другими моими блогами:

Другие блоги, меняющие жизнь для повышения продуктивности и фокуса: