Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: concurrency, semaphore, async, rate limiting, Promise, queue

Какие есть способы ограничения concurrency (например, semaphore)?

Вопрос проверяет понимание механизмов ограничения одновременного выполнения асинхронных операций в JavaScript, что необходимо для предотвращения перегрузки API или ресурсов.

Короткий ответ

В JavaScript для ограничения concurrency используют семафоры, очереди или готовые библиотеки. Семафор — это примитив, который отслеживает количество одновременно выполняемых задач. Можно создать простой семафор с помощью счётчика и Promise. Также можно использовать паттерн 'очереди с ограниченным параллелизмом', где задачи ставятся в очередь и выполняются по мере освобождения слотов. Это полезно для работы с API, имеющими лимиты на количество запросов.

Длинный ответ

Ограничение concurrency — это важная практика при работе с асинхронными операциями, особенно когда нужно выполнить множество задач (например, сетевых запросов), но при этом не перегрузить целевой сервер или не исчерпать лимиты системы (например, количество открытых файлов). В JavaScript, который однопоточный, concurrency относится к одновременному запуску асинхронных операций, которые выполняются в фоне, и их количество нужно контролировать.

Основные подходы

  • Семафор (Semaphore): классический примитив синхронизации, который управляет доступом к общему ресурсу через счётчик. В JS его можно реализовать с помощью Promise и счётчика активных задач.
  • Очередь с ограниченным параллелизмом: задачи помещаются в очередь, и из неё извлекается и запускается не более N задач одновременно. Как только одна задача завершается, запускается следующая.
  • Готовые библиотеки: например, 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 используется при:

  • Вызове внешних API с жёсткими лимитами на количество запросов в секунду (rate limiting).
  • Параллельной обработке файлов или данных, чтобы не перегружать память или CPU.
  • Работе с базами данных, где слишком много одновременных соединений может привести к ошибкам.
  • Скрапинге веб-страниц, чтобы не быть заблокированным из-за слишком частых запросов.

Вывод: Используйте ограничение concurrency, когда вам нужно выполнить много асинхронных задач, но вы должны контролировать нагрузку на систему или соблюдать внешние ограничения. Простая реализация через семафор или очередь подходит для большинства случаев, а для сложных сценариев (например, распределённые системы) стоит рассмотреть специализированные библиотеки.

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • JavaScript

    JavaScript

  • Node.js

    Node.js

Ключевые слова

#concurrency

#semaphore

#async

#rate limiting

#Promise

#queue

Подпишись на Python Developer в телеграм