Sobes.tech
Назад к вопросам
Middle+
7

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

Компании, где спрашивали
экзон

Ответ от нейросети

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

Такой подход позволяет эффективно и безопасно делать множество запросов, не превышая лимиты сервера и не создавая слишком много одновременных соединений.