Semaphore ограничивает число одновременных запросов, а не RPS. Для жёсткого ограничения скорости нужен отдельный временной лимитер, который разрешает старт только в допустимый момент.
Как спроектировать асинхронный семафор (asyncio.Semaphore) для жёсткого ограничения RPS к внешнему API?
Semaphore ограничивает число одновременных запросов, а не RPS. Для жёсткого ограничения скорости нужен отдельный временной лимитер, который разрешает старт только в допустимый момент.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Semaphore ограничивает число одновременных запросов, а не RPS. Для жёсткого ограничения скорости нужен отдельный временной лимитер, который разрешает старт только в допустимый момент.
Для не более R стартов в любом интервале секунды храните времена последних стартов, удаляйте устаревшие и ждите освобождения слота; проверку и резерв выполняйте атомарно по монотонным часам. Semaphore можно добавить для ограничения in-flight. Token bucket допускает настраиваемые bursts и потому не всегда соответствует строгому rolling-лимиту. Между несколькими workers нужен общий лимитер.