“无法写结束运输”是什么意思?

时间:2019-01-31 14:02:11

标签: python-3.x python-asyncio aiohttp

我得到了"Cannot write to closing transport"引发的aiohttp.http_writer.StreamWriter#_write例外,但仅在少数情况下。

相关代码段。

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

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

3 个答案:

答案 0 :(得分:1)

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

从您的代码中删除> SELECT * FROM information_schema.SCHEMATA WHERE schema_name = "xxx"; +--------------+-------------+----------------------------+------------------------+----------+ | CATALOG_NAME | SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME | SQL_PATH | +--------------+-------------+----------------------------+------------------------+----------+ | NULL | xxx | latin1 | latin1_swedish_ci | NULL | +--------------+-------------+----------------------------+------------------------+----------+ > SELECT T.table_name, CCSA.* FROM information_schema.`TABLES` T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` CCSA WHERE CCSA.collation_name = T.table_collation AND T.table_schema = "xxx"; +-------------+-------------------+--------------------+ | table_name | COLLATION_NAME | CHARACTER_SET_NAME | +-------------+-------------------+--------------------+ | clientes | latin1_swedish_ci | latin1 | | clientes_sm | latin1_swedish_ci | latin1 | +-------------+-------------------+--------------------+

答案 1 :(得分:0)

回答:我们应该根据每个请求创建一个新的会话。由于上下文管理器会处理此问题,因此也无需显式关闭response()

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

答案 2 :(得分:0)

如果客户端在读取部分或全部响应之前过早断开连接,则会发生这种情况。如果您正在与移动客户端打交道(可能会在WiFi和移动网络之间切换),或者您的视图需要花费一些时间,但客户端的超时时间较短,则可能会经常遇到这种情况。由于您无法控制客户与您的服务的通话方式,因此可以忽略此问题。

  

aiohttp 3.6.0 introduces code来屏蔽此异常

相关问题