首页 文章

这个async aiohttp代码出了什么问题?

提问于
浏览
3

对于使用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函数)

1 回答

  • 2

    with 是一个上下文管理器,它在它的块中的任何语句之前和之后运行一些代码,通常是簿记 . 这意味着,您的第一个 recv 函数最有可能等待未来引用已经关闭的连接,或者沿着这些方向的某些东西 .

    假设你有一些看起来像这样的代码:

    with open(...) as file:
        file.read()
    

    这就是它的作用,粗略地说:

    file = open(...)
    file.read()
    file.close()
    

    这相当于你在第一个例子中所做的事情:

    file = open()
    file.close()
    ...
    file.read()
    

相关问题