在aiohttp中进行请求时,等待和异步之间有本质区别吗



我的问题是关于在aiohttp中做出响应的正确方式

官方的aiohttp文档为我们提供了一个异步查询的例子:

session = aiohttp.ClientSession()
async with session.get('http://httpbin.org/get') as resp:
print(resp.status)
print(await resp.text())
await session.close()

我不明白,为什么上下文管理器在这里。我所发现的只是__aexit__()方法等待resp.release()方法。但文件也告诉等待resp.release()一般来说是不必要的。

这一切真的让我很困惑。

如果我发现下面的代码更可读,而且不那么嵌套,为什么我要这样做?

session = aiohttp.ClientSession()
resp = await session.get('http://httpbin.org/get')
print(resp.status)
print(await resp.text())
# I finally have not get the essence of this method.
# I've tried both using and not using this method in my code,
# I've not found any difference in behaviour.
# await resp.release()
await session.close()

我已经深入研究了aiohttp.ClientSession及其上下文管理器的来源,但没有发现任何可以澄清这种情况的东西。

最后,我的问题是:有什么区别

通过async with显式管理响应是不必要的,但建议这样做。响应对象的async with的目的是安全而迅速地释放响应使用的资源(通过对resp.release()的调用(。也就是说,即使发生错误,资源也会被释放并可用于进一步的请求/响应。

否则,aiohttp释放响应资源,但不能保证及时。最坏的情况是延迟任意时间,即直到应用程序结束和外部资源(如套接字(超时。


如果没有出现错误(在这种情况下aiohttp会清理未使用的资源(和/或应用程序较短(在这种情形下有足够的资源不需要重用(,则差异不会明显。但是,由于错误可能会意外发生,并且aiohttp是为许多请求/响应设计的,因此建议始终默认通过async with提示清理。

最新更新