Асинхронная обработка запросов функций с использованием asyncio

#python #python-3.x #async-await #python-asyncio #aiohttp

#python #python-3.x #async-ожидание #python-asyncio #aiohttp

Вопрос:

Я пытаюсь добиться асинхронной обработки запросов aiohttp, которые были определены в моем классе следующим образом:

 class Async():    
    async def get_service_1(self, zip_code, session):
        url = SERVICE1_ENDPOINT.format(zip_code)
        response = await session.request('GET', url)
        return await response

    async def get_service_2(self, zip_code, session):
        url = SERVICE2_ENDPOINT.format(zip_code)
        response = await session.request('GET', url)
        return await response

    async def gather(self, zip_code):
        async with aiohttp.ClientSession() as session:
            return await asyncio.gather(
                self.get_service_1(zip_code, session),
                self.get_service_2(zip_code, session)
            )

    def get_async_requests(self, zip_code):
        asyncio.set_event_loop(asyncio.SelectorEventLoop())
        loop = asyncio.get_event_loop()
        results = loop.run_until_complete(self.gather(zip_code))
        loop.close()
        return results
  

При запуске для получения результатов из функции get_async_requests я получаю следующую ошибку:

 TypeError: object ClientResponse can't be used in 'await' expression
  

Где я ошибаюсь в коде? Заранее благодарю

Ответ №1:

Когда вы ожидаете чего-то подобного session.response , начинается ввод-вывод, но aiohttp возвращается, когда получает заголовки; он не хочет, чтобы ответ заканчивался. (Это позволит вам реагировать на код состояния, не дожидаясь всего тела ответа.)

Вам нужно дождаться чего-то, что это сделает. Если вы ожидаете ответа, который содержит текст, это будет response.text . Если вы ожидаете JSON, это response.json . Это будет выглядеть примерно так

 response = await session.get(url)
return await response.text()