Back to questions
Middle+
6
import aiohttp import asyncio async def fetch_all_tickets(self, ticket_ids: list, max_concurrent_requests: int =10): semaphore = asyncio.Semaphore(max_concurrent_requests) async with aiohttp.ClientSession() as session: tasks = [self._get_ticket(ticket_id, session, semaphore) for ticket_id in ticket_ids] tickets = [] for task in tasks: ticket = await task if ticket is not None: tickets.append(ticket) return tickets
Companies where asked
экзон
Answer from AI
sobes.tech AI
В представленном коде используется asyncio.Semaphore для ограничения количества одновременно выполняемых асинхронных запросов к API (через aiohttp). Это предотвращает перегрузку сервера или клиента.
Основная идея:
- Создаётся семафор с максимальным числом одновременных запросов
max_concurrent_requests. - Для каждого
ticket_idсоздаётся задача_get_ticket, которая внутри должна использовать семафор (черезasync with semaphore:), чтобы ограничить параллелизм. - Все задачи запускаются одновременно, но семафор гарантирует, что не более
max_concurrent_requestsвыполняются одновременно. - Результаты собираются последовательно через
await task.
Пример использования семафора внутри _get_ticket:
async def _get_ticket(self, ticket_id, session, semaphore):
async with semaphore:
async with session.get(f'https://api.example.com/tickets/{ticket_id}') as resp:
if resp.status == 200:
return await resp.json()
return None
Такой подход позволяет эффективно и безопасно делать множество запросов, не превышая лимиты сервера и не создавая слишком много одновременных соединений.