В одном из моих запросов я собираю ~ 250 вызовов для одного массива результатов, используя функцию Bluebird Promise.map
. Каждый отдельный вызов занимает ~ 60 мсек, когда выполняется сам по себе, поэтому при параллелизме 10 я ожидаю, что результат основного запроса будет около 1.5sec
(=(250/10)*60ms
).
Но я получаю ответ в диапазоне ~ 15 секунд, как если бы каждый запрос выполнялся один за другим. Независимо от того, какое значение я придаю параметру параллелизма, я всегда получаю одинаковое (слишком длинное) время ответа.
Вот мой код (я использую модуль nano
на сервере node.js):
console.time("total");
let concurrency = req.query.hasOwnProperty("concurrency") ? Number(req.query.concurrency) : 20;
console.time("list_dbs");
nano.db.list().then((body) => {
console.timeEnd("list_dbs");
let dbs = body.filter((db) => db.search(/^ts_[0-9]{4}-[0-9]{2}/g)>-1);
console.log(dbs.length); //244
console.time("Promises");
Promise.map(
dbs,
(db_name) => {
console.time(db_name);
let db = nano.use(db_name);
return db.view(
"blah",
"blah" ,
{
group_level:1,
stale:"ok"
}
).then((body) => {
console.timeEnd(db_name);
let blahs = [];
body.rows.forEach((row) => {
blahs.push(row.key[0]);
});
return(blahs);
}).catch((err) => {
return err;
});
},
{concurrency: concurrency}
).then((values) => {
console.timeEnd("Promises");
res.send((_.union(_.flatten(values))).sort());
console.timeEnd("total");
}).catch((err) => {
res.send(err);
console.timeEnd("total");
});
}).catch((err) => {
res.send(err);
console.timeEnd("total");
});
Что-то не так с моим использованием Promise.map
? Есть ли в кушетке параметр, который регулирует скорость? Как ускорить этот запрос?