У меня возникла проблема, когда я пытаюсь загрузить несколько файлов с сайта 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);