From 749257cb8a6c579f8de63a386f3e8002b45c528c Mon Sep 17 00:00:00 2001 From: 16337 <1633794139@qq.com> Date: Wed, 25 Mar 2026 10:27:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A=E6=88=AA=E5=9B=BE?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8=20Redis=20=E6=96=AD=E7=BA=BF?= =?UTF-8?q?=E5=90=8E=E6=97=A0=E6=B3=95=E8=87=AA=E5=8A=A8=E9=87=8D=E8=BF=9E?= =?UTF-8?q?=E7=9A=84=E6=AD=BB=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 重连失败时不再置 cloud_redis=None,避免后续循环走错分支 - except Exception 分支增加 cloud_redis is None 判断,主动触发重连 - 重连成功后重置退避计时器 --- core/screenshot_handler.py | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/core/screenshot_handler.py b/core/screenshot_handler.py index 8eb033a..4dc8010 100644 --- a/core/screenshot_handler.py +++ b/core/screenshot_handler.py @@ -127,12 +127,12 @@ class ScreenshotHandler: # ==================== 重连 ==================== - def _reconnect_cloud_redis(self): - """重建云端 Redis 连接""" + def _reconnect_cloud_redis(self) -> bool: + """重建云端 Redis 连接,返回是否成功""" try: from core.config_sync import _build_keepalive_options cfg = self._settings.cloud_redis - self._cloud_redis = redis.Redis( + new_client = redis.Redis( host=cfg.host, port=cfg.port, db=cfg.db, @@ -145,11 +145,14 @@ class ScreenshotHandler: socket_keepalive_options=_build_keepalive_options(), health_check_interval=15, ) - self._cloud_redis.ping() + new_client.ping() + self._cloud_redis = new_client logger.info("[截图] 云端 Redis 重连成功") + return True except Exception as e: logger.warning("[截图] 云端 Redis 重连失败: %s", e) - self._cloud_redis = None + # 不置 None,避免后续循环永远无法触发 ConnectionError 重连 + return False # ==================== 主循环 ==================== @@ -196,16 +199,25 @@ class ScreenshotHandler: if self._stop_event.is_set(): return logger.warning("[截图] 云端 Redis 连接断开: %s, %ds 后重连...", e, backoff) - self._reconnect_cloud_redis() self._stop_event.wait(backoff) + self._reconnect_cloud_redis() backoff = min(backoff * 2, max_backoff) except Exception as e: if self._stop_event.is_set(): return - logger.warning("[截图] 监听异常: %s, %ds 后重试", e, backoff) - self._stop_event.wait(backoff) - backoff = min(backoff * 2, max_backoff) + # cloud_redis 为 None 时主动重连,避免死循环 + if self._cloud_redis is None: + logger.warning("[截图] 云端 Redis 未连接, %ds 后重连...", backoff) + self._stop_event.wait(backoff) + if self._reconnect_cloud_redis(): + backoff = 5 # 重连成功,重置退避 + else: + backoff = min(backoff * 2, max_backoff) + else: + logger.warning("[截图] 监听异常: %s, %ds 后重试", e, backoff) + self._stop_event.wait(backoff) + backoff = min(backoff * 2, max_backoff) # ==================== 请求处理 ====================