Что такое Streams3 в Node.js и чем оно отличается от Streams2? - программирование
Подтвердить что ты не робот

Что такое Streams3 в Node.js и чем оно отличается от Streams2?

Я часто слышал о Streams2 и старых потоках, но что такое Streams3? Это упоминается в этом разговоре Торстена Лоренца.

Где я могу прочитать об этом, и какова разница между Streams2 и Streams3.

Выполняя поиск в Google, я также вижу, что он упоминается в списке изменений Node 0.11.5,

поток: упрощение потока, пассивное прослушивание данных (streams3) (isaacs)

4b9b3361

Ответ 1

Я собираюсь сделать это, но я, вероятно, ошибся. Никогда не записывая Streams1 (старые потоки) или Streams2, я, вероятно, не тот парень, который мог бы самостоятельно ответить на этот вопрос, но здесь все идет. Кажется, что есть API Streams1, который до некоторой степени сохраняется. В Streams2 существуют два режима потоков (унаследованные) и нетекущие. Короче говоря, прокладка, поддерживающая текущий режим, уходит. Это было сообщение которое привело к тому, что патч теперь называется Streams3,

Тот же API, что и streams2, но удаляет запутанную модальность потока/старого переключатель режима.

  • Каждый раз, когда вызывается read() и возвращает некоторые данные, происходит событие данных.
  • resume() заставит его повторно называть read(). В противном случае никаких изменений.
  • pause() приведет к повторному вызову read().
  • pipe(dest) и on('data', fn) будет автоматически вызывать resume().
  • Нет переключателей в старом режиме. Там только течет и остановилась. Потоки начинаются с паузы.

К сожалению, для понимания любого описания, которое очень хорошо описывает Streams3, вам нужно сначала понять Streams1, а устаревшие потоки

Предыстория

Во-первых, давайте посмотрим, что говорят Node v0.10.25 о двух режимах,

Считываемые потоки имеют два "режима": режим потока и режим без потока. Когда в потоковом режиме данные считываются из базовой системы и предоставляются в вашу программу как можно быстрее. В нетекающем режиме вы должны явно вызвать stream.read(), чтобы получить куски данных. - Node v0.10.25 Документы

Исаак З. Шлютер сказал в ноябре слайды, которые я выкопал:

streams2

  • "suck streams"
  • Вместо того, чтобы извергать события "данные", вызовите функцию read(), чтобы извлечь данные из источника
  • Решает все проблемы (о которых мы знаем)

Итак, кажется, что в streams1 вы должны создать объект и вызвать .on('data', cb) для этого объекта. Это установило бы событие триггером, и тогда вы были во власти потока. В потоках Streams2 внутренние потоки имеют буферы и вы запрашиваете данные из этих потоков явно (используя `.read). Исаак продолжает указывать, как обратная совместимость работает в Streams2, чтобы поддерживать функционирование модулей Streams1 (old-stream)

поток старого режима streams1

  • Новые потоки могут переключаться в старый режим, где они выводят "данные"
  • Если вы добавляете обработчик событий "data" или вызываете pause() или resume(), затем переключайте
  • Внесение минимальных изменений в существующие тесты, чтобы держать нас в курсе.

Итак, в Streams2 вызов .pause() или .resume() запускает прокладку. И, должно быть, правильно? В Streams2 у вас есть контроль, когда до .read(), и вы не поймаете вещи, которые вас бросают. Это вызвало устаревший режим, который действовал независимо от Streams2.

Возьмем пример из слайда Isaac,

createServer(function(q,s) {
  // ADVISORY only!
  q.pause()
  session(q, function(ses) {
    q.on('data', handler)
    q.resume()
  })
})
  • В потоках 1, q запускает сразу чтение и испускание (вероятно, потери данных), пока вызов q.pause не сообщит q, чтобы остановить извлечение данных, но не из-за испускания событий, чтобы очистить то, что он уже прочитал.
  • В Streams2, q начинает приостанавливаться до вызова .pause(), что означает эмулировать старый режим.
  • В Streams3, q запускается как приостановлено, никогда не читает из дескриптора файла, делая q.pause() noop, а при вызове q.on('data', cb) вызывает q.resume, пока в буфере не будет больше данных, И затем снова вызовите q.resume, делая то же самое.

Ответ 2

Кажется, что Streams3 был введен в io.js, затем в Node 0.11 +

Потоки 1 Поддерживаемые данные переносятся в поток. Не было никакого контроля потребителя, данные были брошены на потребителя, была ли она готова или нет.

Потоки 2 позволяют передавать данные в поток в соответствии с потоками 1 или для того, чтобы потребитель извлекал данные из потока по мере необходимости. Пользователь может управлять потоком данных в режиме pull (используя stream.read(), когда уведомляется о доступных данных). В то же время поток не может поддерживать одновременное нажатие и выключение.

Потоки 3 позволяют извлекать и выталкивать данные в одном потоке.

Отличный обзор здесь:

https://strongloop.com/strongblog/whats-new-io-js-beta-streams3/

Ответ 3

Я предлагаю вам прочитать документацию, а именно раздел "API для потоковых потребителей", это действительно очень понятно, кроме того, я думаю, что другой ответ неверен: http://nodejs.org/api/stream.html#stream_readable_read_size