Что такое конвейер в Node.js?

Node.js1 Изучение

Конвейер в NodeJS — это процесс, с помощью которого байтовые данные из одного потока отправляются в другой поток.

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

Потокив NodeJS — это последовательность байтов. Когда программа обрабатывает некоторые данные, ей необходимо прочитать все данные в память, а затем обработать их и записать данные обратно в какое-то место. Однако этот подход не работает, когда необходимо обработать большое количество данных. Чтобы преодолеть эту проблему, для обработки данных используются алгоритмы потоковой передачи, в которых данные не считываются все сразу, а «втекают» в программу, обрабатываются и «вытекают» из программы. Здесь данные обрабатываются небольшими порциями, и целые данные никогда не хранятся в памяти сразу. Поток данных можно сравнить с примером воды, текущей в реке, где большое количество воды транспортируется, протекая через реку с течением времени. Потоковые алгоритмы более эффективны с точки зрения использования памяти и быстрее. Вы можете прочитать эту статью, чтобы получить подробное руководство попотоки.

Что такое трубопровод?

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

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

Читайте также:  Как выбрать и нанять разработчиков React.JS для вашего проекта?

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

Убедитесь, что на вашем компьютере установлен NodeJS. Если нет, скачайте его отсюда, а затем установите. Все модули, используемые в этом проекте, по умолчанию включены в NodeJS.

Подход 1: подключение потока чтения к потоку записи с использованием pipe()

Структура проекта: Структура нашего проекта будет следующей:

  • index.js:основной, содержащий код.
  • input.txt:файл, из которого считываются данные
  • output.txt:файл, в который записываются данные

В этом подходе необходимы следующи

В этом подходе необходимы следующие модули:

  • fs:модуль файлового потока, используемый для создания файловых потоков и взаимодействия с ними.

Шаг 1: Создайте файл с именем input.txt и вставьте в него следующий текст. Создайте имя файла output.txt и оставьте его пустым.

GeeksForGeeks — это круто.

Шаг 2: Создайте файл index.js. и вставьте в него следующий код.

Javascript

const fs = require("fs");
const fs = require("fs");
 
let rs = fs.createReadStream("./input.txt");
let ws = fs.createWriteStream("./output.txt");
 
function callback(msg) {
    console.log(msg);
}
 
// pipeReadToWrite() accepts two streams a 
// readStream and s writeStream and a callback function.
function pipeReadToWrite(readStream, writeStream, callback) {
    // handles any error occured in the stream
    function handleError(err) {
        // close the streams and call callback
        readStream.close();
        writeStream.close();
        callback(err);
    }
 
    readStream
        .on("error", handleError)   
        .pipe(writeStream)
        .on("error", handleError)
        .on("finish", callback);
}
 
pipeReadToWrite(rs, ws, callback);
let rs = fs.createReadStream("./input.txt");
let ws = fs.createWriteStream("./output.txt");
 
function callback(msg) {
    console.log(msg);
}
 
// pipeReadToWrite() accepts two streams a 
// readStream and s writeStream and a callback function.
function pipeReadToWrite(readStream, writeStream, callback) {
// handles any error occured in the stream
    function handleError(err) {
        // close the streams and call callback
        readStream.close();
        writeStream.close();
        callback(err);
    }
 
    readStream
                .on("error", handleError)
                .pipe(writeStream)
                .on("error", handleError)
                .on("finish", callback);
}
 
pipeReadToWrite(rs,ws,callback);

Объяснение кода:

  • Включите модуль fs (файловый поток), который используется для создания файловых потоков и взаимодействия с ними. Создайте поток чтения и подключите его к input.txt и поток записи и подключите его к output.txt
  • Функция pipeReadToWrite() принимает поток чтения и поток записи.
  • HandleError() — это функция обратного вызова, которая обрабатывает любую ошибку, возникающую при чтении или записи потока.
  • Выполнить функцию pipeReadToWrite() с необходимыми аргументами.

Шаг 3: Запустите файл index.js, написав команду в командной строке.

node index.js

Вывод: откройте output.txt, и вы увидите в нем следующий вывод.

GeeksForGeeks — это круто.

Подход 2: подключение более двух потоков для создания сложного рабочего процесса.

Структура проекта: Структура нашего проекта будет следующей:

  • index.js:основной, содержащий код.
  • input.txt:файл, из которого нужно сжать.

подключение более двух потоков для создания сложного

В этом примере мы подключаем несколько потоков для сжатия файла.

В этом подходе необходимы следующие модули.

  • fs:модуль файлового потока, используемый для создания файловых потоков и взаимодействия с ними.
  • zlib:предоставляет различные методы сжатия файлов.

Шаг 1: Создайте файл с именем input.txt и вставьте в него следующий текст. Создайте имя файла output.txt и оставьте его пустым.

GeeksForGeeks — это круто.

Шаг 2: Создайте файл index.js. и вставьте в него следующий код.

Javascript

const fs = require("fs");
const zlib = require("zlib");
 
// gzip() function accepts a filename 
// to be compressed and a callback function
function gzip(filename, callback) {
    // Create the streams
    let source = fs.createReadStream(filename);
    let destination = fs.createWriteStream(filename + ".gz");
    let gzipper = zlib.createGzip();
     
    // Set up the pipeline
    source
        .on("error", callback)
        .pipe(gzipper)
        .pipe(destination)
        .on("error", callback)
        .on("finish", callback);
}
 
gzip("./input.txt", (msg) => {
    console.log(msg);
});

Объяснение кода:

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

Шаг 3: Запустите файл index.js. Перейдите в командную строку и выполните команду, указанную ниже:

node index.js

Вывод: вы увидите, что создается новый файл с именем input.txt.gz. Это сжатая версия input.txt.

файл inpu

файл input.txt.gz создан

Оцените статью
bestprogrammer.ru
Добавить комментарий