Комментарии 3
А на кой хер вам асинхронность с семафором на 1?
Семафор(1) - это временный костыль, не архитектурное решение.
Задача была: перестать долбить Groq 3 параллельными запросами и вылетать на платный DeepSeek. Semaphore(1) решил это за одну строку кода.
Да, при semaphore(1) asyncio теряет смысл внутри одного дайджеста - запросы идут последовательно, как в синхронном коде. Технически правильное решение - адаптивный rate limiter: считать токены в скользящем окне 60 секунд и притормаживать только когда подходим к лимиту, а не всегда. Тогда asyncio работает на полную когда лимит не давит, и замедляется только при необходимости.
Но для текущей нагрузки (80 пользователей, бесплатные провайдеры с мягкими лимитами) semaphore(1) + 10 сек между пользователями решает задачу и не создаёт сложности. Когда пользователей станет в 10 раз больше - перепишу на нормальный rate limiter.
OmniRoute

Как я довёл расходы на LLM до нуля: почему на бесплатных тарифах параллелизм — враг