Выбор ответа Senior Потоки и буферы обновлено

Чем pipeline лучше pipe

Вопрос

Почему в продакшен-коде вместо src.pipe(transform).pipe(res) рекомендуют await pipeline(src, transform, res) из node:stream/promises?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: pipeline собирает ошибки звеньев и закрывает все потоки цепочки. Backpressure есть и у .pipe(), это неверный аргумент.

Варианты ответа

  1. pipeline быстрее, потому что копирует данные без буферизации
  2. .pipe() не поддерживает backpressure, а pipeline поддерживает
  3. pipeline собирает ошибки звеньев и закрывает все потоки цепочкиправильный ответ
  4. pipeline читает источник целиком в память, поэтому надёжнее

Разбор

Backpressure есть и у .pipe(), это неверный аргумент. Проблема .pipe() в ошибках и очистке: событие error не передаётся по цепочке, каждому потоку нужен свой обработчик, а если клиент оборвал соединение, источник (файл, курсор БД) продолжает висеть открытым, отсюда утечки дескрипторов. pipeline подписывается на ошибки всех звеньев, при первой уничтожает все потоки и отдаёт одну ошибку в промис или колбэк.

Скорость одинаковая, механизм передачи тот же. В память pipeline ничего целиком не читает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.