Код Middle Асинхронные паттерны обновлено

Семафор для ограничения доступа к ресурсу

Условие

Реализуй class Semaphore с конструктором new Semaphore(max):

  • acquire() возвращает промис, который выполняется, когда занятых мест меньше max; ждущие обслуживаются в порядке очереди (FIFO);
  • release() освобождает место и будит следующего ждущего;
  • use(fn): захватывает место, выполняет асинхронную fn, отдаёт её результат и всегда освобождает место, даже если fn бросила.
  • геттеры active (занято мест) и waiting (длина очереди).

Пример: не больше 5 одновременных запросов к внешнему API во всём сервисе.

Что проверяют тесты

  • не больше max одновременно

  • FIFO для ждущих

  • use освобождает место при ошибке

  • use возвращает результат

  • счётчики

Как подойти

Подсказки: 2
  1. Счётчик занятых мест плюс очередь функций resolve ждущих.
  2. При release с непустой очередью место не освобождается, а передаётся следующему.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.

Термины по теме