对于使用aiohttp的以下代码:
async def send(self, msg, url):
async with aiohttp.ClientSession() as session:
async with session.post(url, data=msg) as response:
self._msg = response.read()
async def recv(self):
return await self._msg
它有效...大部分时间,但偶尔(经常,实际上)会导致各种异常 - 通常是截断的响应,或者连接已经被关闭的异常。
相比之下,以下效果非常好:
async def send(self, msg, url):
async with aiohttp.ClientSession() as session:
async with session.post(url, data=msg) as response:
self._msg = await response.read()
async def recv(self):
return self._msg
我想知道为什么,因为第二个版本在技术上不符合我的目的,我需要修复它。 (这是不正确的,因为在读取响应之前可能会调用recv函数)
答案 0 :(得分:2)
with
是一个上下文管理器,它在它的任何语句之前和之后运行一些代码,通常是簿记。这意味着,您的第一个recv
函数最有可能等待未来引用已经关闭的连接,或者沿着这些界线。
我们假设您有一些代码如下:
with open(...) as file:
file.read()
这就是它的作用,粗略地说:
file = open(...)
file.read()
file.close()
这相当于你在第一个例子中所做的事情:
file = open()
file.close()
...
file.read()