Как спроектировать асинхронный семафор (asyncio.Semaphore) для жёсткого ограничения RPS к внешнему API?

Semaphore ограничивает число одновременных запросов, а не RPS. Для жёсткого ограничения скорости нужен отдельный временной лимитер, который разрешает старт только в допустимый момент.

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

Что ответить на собеседовании

Semaphore ограничивает число одновременных запросов, а не RPS. Для жёсткого ограничения скорости нужен отдельный временной лимитер, который разрешает старт только в допустимый момент.

Подробный разбор

Ответ с пояснениями

Semaphore ограничивает число одновременных запросов, а не RPS. Для жёсткого ограничения скорости нужен отдельный временной лимитер, который разрешает старт только в допустимый момент.

Для не более R стартов в любом интервале секунды храните времена последних стартов, удаляйте устаревшие и ждите освобождения слота; проверку и резерв выполняйте атомарно по монотонным часам. Semaphore можно добавить для ограничения in-flight. Token bucket допускает настраиваемые bursts и потому не всегда соответствует строгому rolling-лимиту. Между несколькими workers нужен общий лимитер.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее