Подтвердить что ты не робот

В чем разница между читаемым и данным событием потока process.stdin?

сказать, что у меня

process.stdin.setEncoding('utf8');
var myString = '';

В чем разница между

process.stdin.on('readable', function() {
  myString += process.stdin.read();
});

и

process.stdin.on('data', function(chunk) {
  myString += chunk;
});

Они дают мне тот же myString, если строка ввода одинакова, когда stdin end

Каковы наилучшие методы для каждого? Благодаря

4b9b3361

Ответ 1

Это два разных API, которые позволяют вам получать доступ к одному потоку блоков данных. API 'readable' был введен в Node 0.10.0 как часть "Потоки 2", поэтому, если вы его ищете, это должно помочь. Ядро проблемы заключается в том, что интерфейс 'readable' позволяет значительно упростить управление и буферизацию данных.

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

Например, в сетевом потоке, если клиент отправляет данные по TCP-соединению на сервер, а сервер очень занят, он будет принимать события readable, но он может предпочесть ждать, чтобы прочитать данные до тех пор, пока на самом деле у него есть ресурсы для обработки данных. Не считывая данные, поток будет буферизировать его, и по мере приближения этого буфера к максимальному размеру поток перестанет считывать пакеты из операционной системы, чтобы избежать слишком большого количества ОЗУ. Затем операционная система начнет отбрасывать пакеты, и поскольку пакеты были удалены, клиент, который отправляет данные, уменьшит скорость отправки данных, чтобы уменьшить количество пакетов.

Все это технически поддерживается с помощью реализации более старого потока "V1", но сделать это было гораздо сложнее.

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