@@ -79,22 +79,42 @@ class HeartbeatThread(threading.Thread):
|
|||||||
self.interval = interval
|
self.interval = interval
|
||||||
self.client_id = get_unique_id()
|
self.client_id = get_unique_id()
|
||||||
self.running = True
|
self.running = True
|
||||||
|
self.stop_event = threading.Event() # 添加事件对象用于可中断的等待
|
||||||
|
self.last_heartbeat_time = 0 # 记录上次发送心跳的时间
|
||||||
|
|
||||||
def run(self):
|
def run(self):
|
||||||
"""线程运行函数"""
|
"""线程运行函数"""
|
||||||
logger.debug(f"心跳线程已启动,客户端ID: {self.client_id}")
|
logger.debug(f"心跳线程已启动,客户端ID: {self.client_id}")
|
||||||
|
|
||||||
while self.running:
|
while self.running:
|
||||||
|
# 发送心跳
|
||||||
if send_heartbeat(self.server_url, self.client_id):
|
if send_heartbeat(self.server_url, self.client_id):
|
||||||
logger.info(f"{self.interval}秒后发送下一次心跳...")
|
logger.info(f"{self.interval}秒后发送下一次心跳...")
|
||||||
else:
|
else:
|
||||||
logger.info(f"{self.interval}秒后重试...")
|
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):
|
def stop(self):
|
||||||
"""停止线程"""
|
"""停止线程"""
|
||||||
self.running = False
|
self.running = False
|
||||||
|
self.stop_event.set() # 设置事件,中断等待
|
||||||
|
logger.debug("心跳线程已收到停止信号")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
|
|||||||
Reference in New Issue
Block a user