"Cannot write to closing transport" 是什么意思?

What does "Cannot write to closing transport" mean?

我收到了从 aiohttp.http_writer.StreamWriter#_write 引发的异常 "Cannot write to closing transport",但只是在一小部分情况下。

相关片段。

    session: aiohttp.ClientSession
    async with session.get(url, timeout=60) as response:
        txt = await response.text()
        response.close()
        return txt

这是怎么回事?我不认为服务器大小正在关闭套接字。

这意味着您的连接已经关闭。当客户端断开连接时发生,但服务器仍然尝试响应他。

从您的代码中删除 response.close()

答案:我们应该为每个请求创建一个新会话。也不需要显式关闭 response(),因为上下文管理器会处理它。

async with aiohttp.ClientSession().get(url, timeout=60) as response:
    txt = await response.text()
    return txt

如果客户端在读取部分或全部响应之前过早断开连接,就会发生这种情况。如果您正在处理移动客户端(可能会在 WiFi 和移动网络之间切换)或者如果您的视图需要一些时间,但客户端的超时时间较低,则您可能会经常遇到这种情况。由于您无法控制客户如何与您的服务对话,因此忽略这一点可能是安全的。

aiohttp 3.6.0 introduces code to slience this exception