为什么在使用aiohttp模块时必须使用async with?

时间:2019-03-19 05:28:11

标签: python-3.x python-requests python-asyncio aiohttp

在Python中使用asyncioaiohttp编写异步搜寻器时,我总是有一个问题:为什么必须使用async with,如果不使用,很容易报告错误使用它们。

尽管aiohttp也有方法request,但它可以支持调用更简单的api。我想知道有什么区别。我仍然非常喜欢requests模块,我不知道它是否可以像requests模块一样简单。

1 个答案:

答案 0 :(得分:0)

  

为什么必须使用async with

这不像您必须使用async with,它只是一种用于确保清理资源的故障安全设备。以documentation中的经典示例为例:

async def fetch(session, url):
    async with session.get(url) as response:
        return await response.text()

您可以将其重写为:

async def fetch(session, url):
    response = await session.get(url)
    return await response.text()

此版本似乎可以正常工作,但是它不会关闭响应对象,因此某些OS资源(例如基础连接)可能会无限期地保持不变。正确的版本如下所示:

async def fetch(session, url):
    response = await session.get(url)
    content = await response.text()
    response.close()
    return content

如果在阅读文本时引发异常,则此版本仍无法关闭响应。可以通过使用finally来解决问题-这正是withasync with在幕后所做的。使用async with块可以使代码更健壮,因为该语言可确保每当执行离开该块就调用清除代码。