Семафор
Условие
createSemaphore(limit): acquire() возвращает промис с функцией release. Не больше limit одновременно удерживаемых пропусков, ожидающие получают пропуск в порядке очереди.
Что проверяют тесты
пропускает в пределах лимита
сверх лимита ждёт
очередь соблюдается
ограничивает параллелизм
освобождение без ожидающих
Как подойти
Семафор - более общая вещь, чем пул: он ограничивает доступ к любому ресурсу, а не оборачивает конкретные задачи. Тонкость в release: если просто уменьшить счётчик и разбудить следующего, между этими шагами счётчик проседает и лимит может быть нарушен при одновременных освобождениях. Поэтому передача пропуска делается атомарно. limit=1 превращает семафор в мьютекс - так защищают запись в localStorage или IndexedDB от гонок.
Подсказки: 3
- Счётчик занятых плюс очередь ожидающих resolve.
- При освобождении сразу отдай пропуск первому в очереди, не уменьшая счётчик до нуля.
- Каждый ожидающий должен получить свою функцию освобождения.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.