我得到了"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
这是怎么回事?我不认为服务器大小正在关闭套接字。
答案 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来屏蔽此异常