WebSockets 查询失败且心跳较短

问题描述 投票:0回答:1

我有一个 Python 服务器,它为来自 Postgres DB 的大量数据提供一些长时间运行的查询。请求通过 WebSockets 提供服务,服务器使用 asyncio 和 aiohttp 作为主要框架。

一般来说,每个请求都会被分割成更小的块,每个块都有其对数据库的子查询,在单独的线程中运行。

在某些情况下,查询会无明显原因失败,客户端抱怨服务器端连接已关闭,反之亦然,服务器记录请求已被客户端关闭。

经过一番尝试和错误,我发现可以通过增加 WebSockets 请求的心跳来缓解这种情况:

await aiohttp.ClientSession().ws_connect(
    self.url,
    heartbeat=60.0,  # was 20 seconds
    # ...
)

但是我想找到更好的方法来处理这个问题。另外,我不完全确定我理解为什么会发生这种情况。

有人认为这是由于 GIL 造成的,另一个线程中的一些 CPU 密集型任务可能会垄断事物并冻结所有其他线程。在这种情况下,我如何确保正在运行的任何 CPU 密集型任务都不会导致心跳不足?

我遇到的另一个问题是如何调试它。由于日志或调试很困难,那么将来查明此问题或类似问题的好策略是什么?

websocket python-multithreading aiohttp
1个回答
0
投票

您尚未提供代码,但可能是因为仅在迭代消息时处理心跳响应。复制https://github.com/aio-libs/aiohttp/discussions/7320#discussioncomment-6144209

简而言之,当从 websocket 读取时,如果需要花费大量时间来处理消息,请将处理推送到另一个任务,以便循环可以继续迭代。否则将导致 ping 呼叫无法及时处理。

© www.soinside.com 2019 - 2024. All rights reserved.