Узнайте, для чего нужны потоки, почему они так важны и как их использовать.
- Что такое стримы
- Почему стримы
- Пример потока
- трубка()
- API-интерфейсы узлов на основе потоков
- Различные типы потоков
- Как создать читаемый поток
- Как создать доступный для записи поток
- Как получить данные из читаемого потока
- Как отправить данные в поток с возможностью записи
- Сигнализация записываемого потока, который вы закончили писать
Что такое стримы
Потоки - одна из фундаментальных концепций, лежащих в основе приложений Node.js.
Они позволяют эффективно обрабатывать чтение / запись файлов, сетевое взаимодействие или любой вид сквозного обмена информацией.
Потоки - это не уникальная концепция Node.js. Они были введены в операционную систему Unix несколько десятилетий назад, и программы могут взаимодействовать друг с другом, передавая потоки через оператор канала (|
).
Например, традиционным способом, когда вы говорите программе прочитать файл, файл считывается в память от начала до конца, а затем вы его обрабатываете.
Используя потоки, вы читаете его по частям, обрабатывая его содержимое, не сохраняя его в памяти.
Node.jsstream
модульобеспечивает основу, на которой построены все API-интерфейсы потоковой передачи.
Почему стримы
Потоки в основном предоставляют два основных преимущества при использовании других методов обработки данных:
- Эффективность памяти: вам не нужно загружать большие объемы данных в память, прежде чем вы сможете их обработать
- Эффективность времени: требуется гораздо меньше времени, чтобы начать обработку данных, как только они у вас есть, вместо того, чтобы ждать, пока вся полезная нагрузка данных будет доступна для запуска
Пример потока
Типичный пример - чтение файлов с диска.
Использование узлаfs
модуль вы можете читать файл и обслуживать его через HTTP, когда новое соединение установлено с вашим http-сервером:
const http = require('http')
const fs = require('fs')
const server = http.createServer(function (req, res) {
fs.readFile(__dirname + ‘/data.txt’, (err, data) => {
res.end(data)
})
})
server.listen(3000)
readFile()
читает все содержимое файла и по завершении вызывает функцию обратного вызова.
res.end(data)
в обратном вызове вернет содержимое файла HTTP-клиенту.
Если файл большой, операция займет довольно много времени. Вот то же самое, написанное с использованием потоков:
const http = require('http')
const fs = require('fs')
const server = http.createServer((req, res) => {
const stream = fs.createReadStream(__dirname + ‘/data.txt’)
stream.pipe(res)
})
server.listen(3000)
Вместо того, чтобы ждать, пока файл будет полностью прочитан, мы начинаем его потоковую передачу HTTP-клиенту, как только у нас есть фрагмент данных, готовый к отправке.
трубка()
В приведенном выше примере используется строкаstream.pipe(res)
: thepipe()
вызывается в файловом потоке.
Что делает этот код? Он берет источник и направляет его в пункт назначения.
Вы вызываете его в исходном потоке, поэтому в этом случае файловый поток передается по конвейеру в ответ HTTP.
Возвращаемое значениеpipe()
- это целевой поток, что очень удобно, позволяя связать несколькоpipe()
звонки, вот так:
src.pipe(dest1).pipe(dest2)
Эта конструкция аналогична выполнению
src.pipe(dest1)
dest1.pipe(dest2)
API-интерфейсы узлов на основе потоков
Благодаря своим преимуществам многие базовые модули Node.js предоставляют встроенные возможности обработки потоков, в частности:
process.stdin
возвращает поток, подключенный к stdinprocess.stdout
возвращает поток, подключенный к stdoutprocess.stderr
возвращает поток, подключенный к stderrfs.createReadStream()
создает читаемый поток в файлfs.createWriteStream()
создает доступный для записи поток в файлnet.connect()
инициирует потоковое соединениеhttp.request()
возвращает экземпляр класса http.ClientRequest, который является доступным для записи потокомzlib.createGzip()
сжимать данные с помощью gzip (алгоритм сжатия) в потокzlib.createGunzip()
распаковать поток gzip.zlib.createDeflate()
сжатие данных с помощью deflate (алгоритм сжатия) в потокzlib.createInflate()
распаковать спущенный поток
Различные типы потоков
Есть четыре класса потоков:
Readable
: поток, из которого вы можете перенаправить, но не в него (вы можете получать данные, но не отправлять в него данные). Когда вы помещаете данные в читаемый поток, они буферизуются до тех пор, пока потребитель не начнет читать данные.Writable
: поток, в который вы можете подключиться, но не из него (вы можете отправлять данные, но не получать от них)Duplex
: поток, в который можно передавать и передавать по каналу, в основном комбинация потока с возможностью чтения и записи.Transform
: поток преобразования похож на дуплексный, но вывод является преобразованием его ввода
Как создать читаемый поток
Получаем поток Readable изstream
модуль, и мы его инициализируем
const Stream = require('stream')
const readableStream = new Stream.Readable()
Теперь, когда поток инициализирован, мы можем отправлять в него данные:
readableStream.push('hi!')
readableStream.push('ho!')
Как создать доступный для записи поток
Чтобы создать доступный для записи поток, мы расширяем базуWritable
объект, и мы реализуем его метод _write ().
Сначала создайте объект потока:
const Stream = require('stream')
const writableStream = new Stream.Writable()
затем реализовать_write
:
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
Теперь вы можете направить читаемый поток в:
process.stdin.pipe(writableStream)
Как получить данные из читаемого потока
Как мы читаем данные из читаемого потока? Использование записываемого потока:
const Stream = require('stream')
const readableStream = new Stream.Readable()
const writableStream = new Stream.Writable()
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
readableStream.pipe(writableStream)
readableStream.push(‘hi!’)
readableStream.push(‘ho!’)
Вы также можете напрямую использовать читаемый поток, используяreadable
мероприятие:
readableStream.on('readable', () => {
console.log(readableStream.read())
})
Как отправить данные в поток с возможностью записи
Использование потокаwrite()
метод:
writableStream.write('hey!\n')
Сигнализация записываемого потока, который вы закончили писать
Использоватьend()
метод:
const Stream = require('stream')
const readableStream = new Stream.Readable()
const writableStream = new Stream.Writable()
writableStream._write = (chunk, encoding, next) => {
console.log(chunk.toString())
next()
}
readableStream.pipe(writableStream)
readableStream.push(‘hi!’)
readableStream.push(‘ho!’)
writableStream.end()
Скачать мою бесплатнуюСправочник по Node.js
Дополнительные руководства по узлам:
- Введение в менеджер пакетов npm
- Введение в Node.js
- HTTP-запросы с использованием Axios
- Где разместить приложение Node.js
- Взаимодействовать с Google Analytics API с помощью Node.js
- Средство выполнения пакетов npx Node
- Руководство по package.json
- Где npm устанавливает пакеты?
- Как обновить Node.js
- Как использовать или выполнить пакет, установленный с помощью npm
- Файл package-lock.json
- Семантическое управление версиями с использованием npm
- Следует ли зафиксировать папку node_modules в Git?
- Обновите все зависимости Node до последней версии
- Разбор JSON с помощью Node.js
- Найдите установленную версию пакета npm
- Node.js потоки
- Установите старую версию пакета npm
- Получить текущую папку в Node
- Как зарегистрировать объект в Node
- Предоставление функциональности из файла узла с помощью экспорта
- Различия между узлом и браузером
- Сделайте HTTP-запрос POST с помощью Node
- Получить данные тела HTTP-запроса с помощью Node
- Буферы узлов
- Краткая история Node.js
- Как установить Node.js
- Сколько JavaScript вам нужно знать, чтобы использовать Node?
- Как использовать Node.js REPL
- Узел, принимать аргументы из командной строки
- Вывод в командную строку с помощью Node
- Принять ввод из командной строки в Node
- Удаление пакетов npm с помощью `npm uninstall`
- npm глобальные или локальные пакеты
- зависимости npm и devDependencies
- Цикл событий Node.js
- Понимание process.nextTick ()
- Понимание setImmediate ()
- Эмиттер событий узла
- Создайте HTTP-сервер
- Выполнение HTTP-запросов с помощью Node
- Модуль Node fs
- HTTP-запросы в Node с использованием Axios
- Чтение файлов с помощью Node
- Пути к файлам узлов
- Написание файлов с помощью Node
- Статистика файла узла
- Работа с файловыми дескрипторами в Node
- Работа с папками в Node
- Модуль пути к узлу
- Модуль Node http
- Использование WebSockets с Node.js
- Основы работы с MySQL и Node
- Обработка ошибок в Node.js
- Путеводитель по мопсу
- Как читать переменные среды из Node.js
- Как выйти из программы Node.js
- Модуль Node os
- Модуль событий узла
- Узел, разница между разработкой и производством
- Как проверить, существует ли файл в Node.js
- Как создать пустой файл в Node.js
- Как удалить файл с помощью Node.js
- Как получить дату последнего обновления файла с помощью Node.js
- Как определить, сегодня ли дата в JavaScript
- Как записать объект JSON в файл в Node.js
- Почему вам следует использовать Node.js в вашем следующем проекте?
- Запускайте веб-сервер из любой папки
- Как использовать MongoDB с Node.js
- Используйте Chrome DevTools для отладки приложения Node.js
- Что такое pnpm?
- Список параметров среды выполнения Node.js v8
- Как исправить ошибку «Отсутствует доступ для записи» при использовании npm
- Как включить модули ES в Node.js
- Как создать дочерний процесс с помощью Node.js
- Как получить в Express и разобранное, и необработанное тело
- Как обрабатывать загрузку файлов в Node.js
- Каковы одноранговые зависимости в модуле Node?
- Как написать файл CSV с помощью Node.js
- Как читать CSV-файл с помощью Node.js
- Модули ядра узла
- Увеличение номеров сразу нескольких папок с помощью Node.js
- Как распечатать холст по URL-адресу данных
- Как создать и сохранить изображение с помощью Node.js и Canvas
- Как скачать изображение с помощью Node.js
- Как массово переименовывать файлы в Node.js
- Как получить имена всех файлов в папке в Node
- Как использовать обещания и ожидания с функциями обратного вызова Node.js
- Как протестировать пакет npm локально
- Как проверить текущую версию Node.js во время выполнения
- Как использовать Sequelize для взаимодействия с PostgreSQL
- Обслуживайте HTML-страницу с помощью Node.js
- Как устранить ошибку `util.pump is not a function` в Node.js