Вопрос проверяет понимание механизмов ограничения одновременного выполнения асинхронных операций в JavaScript, что необходимо для предотвращения перегрузки API или ресурсов.
Ограничение concurrency — это важная практика при работе с асинхронными операциями, особенно когда нужно выполнить множество задач (например, сетевых запросов), но при этом не перегрузить целевой сервер или не исчерпать лимиты системы (например, количество открытых файлов). В JavaScript, который однопоточный, concurrency относится к одновременному запуску асинхронных операций, которые выполняются в фоне, и их количество нужно контролировать.
p-limit, async (с функцией parallelLimit), bottleneck для более сложного rate limiting.Создадим класс Semaphore, который будет отслеживать количество разрешений (permits). Метод acquire возвращает Promise, который разрешится, когда будет доступно разрешение.
class Semaphore {
constructor(maxConcurrency) {
this.max = maxConcurrency;
this.current = 0;
this.queue = [];
}
async acquire() {
if (this.current < this.max) {
this.current++;
return Promise.resolve();
}
return new Promise(resolve => {
this.queue.push(resolve);
});
}
release() {
this.current--;
if (this.queue.length > 0) {
this.queue.shift()(); // Разрешаем следующую задачу в очереди
this.current++;
}
}
}
// Использование
const sem = new Semaphore(3);
async function limitedTask(id) {
await sem.acquire();
try {
console.log(`Задача ${id} начата`);
// Имитация асинхронной работы
await new Promise(res => setTimeout(res, 1000));
console.log(`Задача ${id} завершена`);
} finally {
sem.release();
}
}
// Запуск 10 задач, но не более 3 одновременно
for (let i = 0; i < 10; i++) limitedTask(i);Ограничение concurrency используется при:
Вывод: Используйте ограничение concurrency, когда вам нужно выполнить много асинхронных задач, но вы должны контролировать нагрузку на систему или соблюдать внешние ограничения. Простая реализация через семафор или очередь подходит для большинства случаев, а для сложных сценариев (например, распределённые системы) стоит рассмотреть специализированные библиотеки.
Уровень
Рейтинг:
3
Сложность:
5
Навыки
JavaScript
Node.js
Ключевые слова
Подпишись на Python Developer в телеграм