From 34378adca941b0e3cd8ae1de84e574c55fed3676 Mon Sep 17 00:00:00 2001 From: HYY Date: Sat, 22 Mar 2025 17:40:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E5=B0=9D=E8=AF=95=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E6=97=A0=E6=B3=95=E6=AD=A3=E5=B8=B8=E5=8F=91=E9=80=81=E5=BF=83?= =?UTF-8?q?=E8=B7=B3=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/remote/remote.py | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/plugins/remote/remote.py b/src/plugins/remote/remote.py index 65d77cc2d..fdc805df1 100644 --- a/src/plugins/remote/remote.py +++ b/src/plugins/remote/remote.py @@ -79,22 +79,42 @@ class HeartbeatThread(threading.Thread): self.interval = interval self.client_id = get_unique_id() self.running = True + self.stop_event = threading.Event() # 添加事件对象用于可中断的等待 + self.last_heartbeat_time = 0 # 记录上次发送心跳的时间 def run(self): """线程运行函数""" logger.debug(f"心跳线程已启动,客户端ID: {self.client_id}") while self.running: + # 发送心跳 if send_heartbeat(self.server_url, self.client_id): logger.info(f"{self.interval}秒后发送下一次心跳...") else: logger.info(f"{self.interval}秒后重试...") - - time.sleep(self.interval) # 使用同步的睡眠 + + self.last_heartbeat_time = time.time() + + # 使用可中断的等待代替 sleep + # 每秒检查一次是否应该停止或发送心跳 + remaining_wait = self.interval + while remaining_wait > 0 and self.running: + # 每次最多等待1秒,便于及时响应停止请求 + wait_time = min(1, remaining_wait) + if self.stop_event.wait(wait_time): + break # 如果事件被设置,立即退出等待 + remaining_wait -= wait_time + + # 检查是否由于外部原因导致间隔异常延长 + if time.time() - self.last_heartbeat_time >= self.interval * 1.5: + logger.warning("检测到心跳间隔异常延长,立即发送心跳") + break def stop(self): """停止线程""" self.running = False + self.stop_event.set() # 设置事件,中断等待 + logger.debug("心跳线程已收到停止信号") def main():