Код Senior Реализация с нуля обновлено

Семафор

Условие

createSemaphore(limit): acquire() возвращает промис с функцией release. Не больше limit одновременно удерживаемых пропусков, ожидающие получают пропуск в порядке очереди.

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

  • пропускает в пределах лимита

  • сверх лимита ждёт

  • очередь соблюдается

  • ограничивает параллелизм

  • освобождение без ожидающих

Как подойти

Семафор - более общая вещь, чем пул: он ограничивает доступ к любому ресурсу, а не оборачивает конкретные задачи. Тонкость в release: если просто уменьшить счётчик и разбудить следующего, между этими шагами счётчик проседает и лимит может быть нарушен при одновременных освобождениях. Поэтому передача пропуска делается атомарно. limit=1 превращает семафор в мьютекс - так защищают запись в localStorage или IndexedDB от гонок.

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

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

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