Код Middle Асинхронные паттерны обновлено
Семафор для ограничения доступа к ресурсу
Условие
Реализуй class Semaphore с конструктором new Semaphore(max):
acquire()возвращает промис, который выполняется, когда занятых мест меньшеmax; ждущие обслуживаются в порядке очереди (FIFO);release()освобождает место и будит следующего ждущего;use(fn): захватывает место, выполняет асинхроннуюfn, отдаёт её результат и всегда освобождает место, даже еслиfnбросила.- геттеры
active(занято мест) иwaiting(длина очереди).
Пример: не больше 5 одновременных запросов к внешнему API во всём сервисе.
Что проверяют тесты
не больше max одновременно
FIFO для ждущих
use освобождает место при ошибке
use возвращает результат
счётчики
Как подойти
Подсказки: 2
- Счётчик занятых мест плюс очередь функций
resolveждущих. - При
releaseс непустой очередью место не освобождается, а передаётся следующему.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
retry с backoff и фильтром ошибок
Следующий вопрос
singleFlight: склейка одинаковых запросов