Python使用sseclient订阅SSE通道报111连接拒绝 如何等待服务恢复
解决方案
你的代码出现中断的核心原因是:ConnectionError 发生在SSEClient初始化、连接服务端的阶段,你现有的异常捕获只包裹了事件处理的逻辑,没有覆盖连接建立的环节,同时你把连接和事件遍历逻辑放在了线程的__init__方法中,一旦初始化失败就会直接终止线程运行。
你可以按照以下逻辑修改代码,实现断开自动重试:
- 把连接建立、事件遍历的逻辑挪到线程的
run方法中,避免实例化线程时直接阻塞或抛错 - 在外层加无限循环,捕获所有连接相关的异常,重试前添加等待间隔,避免无意义的频繁请求
- 连接恢复后自动重新订阅SSE通道,不需要手动重启客户端
修改后的示例代码如下:
import json import logging import threading import time from sseclient import SSEClient import requests class SSE_Handler(threading.Thread): def __init__(self, url, retry_interval=5): threading.Thread.__init__(self) self.url = url self.retry_interval = retry_interval # 断开后重试等待时间,单位秒 self.daemon = True # 设为守护线程,主程序退出时自动结束该线程 def run(self): while True: sse_events = None try: # 初始化SSE连接 sse_events = SSEClient(self.url) # 遍历处理事件 for event in sse_events: try: if event.event == "SYSTEM_RESTART": print("System restart event") # reboot_system() # 你的原有逻辑 elif event.event == "SERVICE_RESTART": print("Service restart event") # restart_service() # 你的原有逻辑 else: print(f"Received unhandled event: {event.event}") except Exception as e: logging.error(f"Event handle error: {e}") except requests.exceptions.ConnectionError: logging.warning(f"SSE server disconnected, retry after {self.retry_interval}s...") except Exception as e: logging.error(f"Unexpected error: {e}, retry after {self.retry_interval}s...") finally: # 关闭无效连接 if sse_events: try: sse_events.close() except: pass # 等待后重试 time.sleep(self.retry_interval)
你可以根据实际需求调整retry_interval的重试间隔值,如果需要添加最大重试次数限制,也可以在循环里添加计数器判断,达到阈值后再退出。
内容的提问来源于stack exchange,提问作者Abhinay Pandey
相关产品推荐
相关产品推荐

