在Python中使用asyncio
和aiohttp
编写异步搜寻器时,我总是有一个问题:为什么必须使用async with
,如果不使用,很容易报告错误使用它们。
尽管aiohttp
也有方法request
,但它可以支持调用更简单的api。我想知道有什么区别。我仍然非常喜欢requests
模块,我不知道它是否可以像requests
模块一样简单。
答案 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
来解决问题-这正是with
和async with
在幕后所做的。使用async with
块可以使代码更健壮,因为该语言可确保每当执行离开该块就调用清除代码。