使用asyncio异步处理功能请求

时间:2020-09-22 09:42:06

标签: python python-3.x async-await 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 个答案:

答案 0 :(得分:3)

当您等待session.response之类的东西时,I / O启动,但是aiohttp在收到标头时返回;它不希望响应完成。 (这将使您对状态代码做出反应,而不必等待整个响应。)

您需要等待执行此操作的操作。如果您期望包含文本的响应,则为response.text。如果您期望使用JSON,则为response.json。看起来像

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