node.js, как справиться с быстрым производителем и медленным потребителем с противодавлением - PullRequest
0 голосов
/ 01 мая 2018

Я очень новичок в node.js и не понимаю документации о потоках. Надеюсь получить несколько советов.

Я читаю очень большую файловую строку, а затем для каждой строки я вызываю асинхронный сетевой API.

Очевидно, что локальный файл читается намного быстрее, чем завершены асинхронные вызовы:

var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream(program.input)
});

lineReader.on('line', function (line) {
    client.execute(query, [line], function(err, result) {
        // needs to pressure the line reader here
        var myJSON = JSON.stringify(result);
        console.log("line=%s json=%s",myJSON);
    });
});

Как можно добавить противодавление в методе execute?

1 Ответ

0 голосов
/ 05 мая 2018

Решение состоит в том, чтобы обернуть асинхронное поведение в потоковом модуле записи и ограничить асинхронное чтение из модуля записи:

val count = 0;
var writable = new stream.Writable({
    write: function (line, encoding, next) {
        count++;
        if (count < concurrent) {
            next();
        }

        asyncFunctionToCall(...) {
            // completion callback
            // reduce the count and release back pressure
            count--;
            next();
            ...
      }
});

var stream = fs.createReadStream(program.input, {encoding: 'utf8'});
stream = byline.createStream(stream);
stream.pipe(writable);
...