Без ограничителя конкурентности запуск множества async-задач одновременно может перегрузить внешние API, исчерпать ресурсы браузера или вызвать ошибки rate-limiting. Ограничитель конкурентности гарантирует, что одновременно выполняется только контролируемое количество промисов.
Ограничитель конкурентности поддерживает два элемента:
Когда новая задача отправляется:
async function concurrencyLimiter(tasks, limit) {
const queue = [...tasks];
let active = 0;
return new Promise((resolve) => {
const results = [];
function runNext() {
if (queue.length === 0 && active === 0) return resolve(results);
while (active < limit && queue.length > 0) {
const task = queue.shift();
active++;
task().then((result) => {
results.push(result);
active--;
runNext();
});
}
}
runNext();
});
}
Ограничитель конкурентности решает проблему неконтролируемого параллельного выполнения, работая как регулировщик трафика — обеспечивая стабильность системы, соблюдение лимитов API и предотвращение исчерпания ресурсов, при этом сохраняя максимально эффективное выполнение задач.
Ограничитель одновременности использует счётчик для отслеживания активных задач и очередь для хранения ожидающих задач, гарантируя, что количество одновременно выполняемых Promise никогда не превысит заданный лимит.
Новый — ещё не проверен сообществом
Вы