You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.13 10:54:00