NodeJS Параллельные загрузки SFTP приводят к разным длинам файлов - PullRequest
0 голосов
/ 19 октября 2018

У меня возникла проблема, когда я пытаюсь загрузить несколько файлов с сайта SFTP.Когда я загружаю их по одному, я получаю ожидаемый результат, но когда я загружаю их одновременно с обещаниями, размеры файлов часто отличаются.Я использую пакет Bluebird, чтобы иметь возможность загружать файлы с согласованным параллелизмом.Если для параллелизма задано значение 1, у меня нет проблем, но есть проблемы с более высоким значением.

Код:

const Client = require('ssh2').Client;
const Promise = require('bluebird');

const connSettings = {
  host: 'xxx.xxx.xxx.xx',
  port: 22,
  username: 'username',
  password: 'password',
}

const conn = new Client();
conn.on('ready', function () {
  conn.sftp(async function (err, sftp) {

    const fileNames = ['file1.txt', 'file2.txt', 'file3.txt', 'file4.txt', 'file5.txt', 'file6.txt', 'file7.txt', 'file8.txt', 'file9.txt', 'file10.txt'];

    // Create promise for downloaded file
    const promiseProducer = (fileName) => {

        return new Promise((resolve, reject) => {
          const stream = sftp.createReadStream(fileName, {
            flags: 'r',
            encoding: 'utf8',
            autoClose: true,
            highWaterMark: 65535
          });
          let text = '';
          stream
            .on('data', (d) => { text += d; })
            .on('end', () => {
              console.log(`${fileNames.indexOf(fileName)}:Text Length:`, text.length);
              resolve(text);
            });
        });
    }

    await Promise.map(fileNames, promiseProducer, { concurrency: 2 }) // <-- concurrency of 1 works fine, anything larger causes problems
    conn.end();
  });
}).connect(connSettings);

Журналы (1 параллелизм):

0:Text Length: 6160
1:Text Length: 11948
2:Text Length: 18196
3:Text Length: 25400
4:Text Length: 31120
5:Text Length: 37104
6:Text Length: 43544
7:Text Length: 48156
8:Text Length: 54408
9:Text Length: 59640

Журналы (2 одновременных):

0:Text Length: 6160
1:Text Length: 11948
2:Text Length: 25400
3:Text Length: 31120
4:Text Length: 37104
5:Text Length: 43544
6:Text Length: 48156
7:Text Length: 54408
8:Text Length: 59640
9:Text Length: 59640

Как видите, длина строк для каждого файла различается в зависимости от того, сколько я загружаю одновременно.Есть идеи, почему это может происходить?Пересекаются ли потоки каким-либо образом?

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

т.е.

let promises = [];
for (let i = 0; i < fileNames.length; i++) {
  promises.push(promiseProducer(fileNames[i]));
  if (i % 10 === 0) {
    await Promise.all(promises);
    promises = [];
  }
}
await Promise.all(promises);
...