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

如何通过Requests库检测API流连接是否已关闭?

问题:如何判断API流连接是否断开?

我正在连接一个API流,该连接始终处于活跃状态并接收来自该API的数据。问题在于,有时连接会关闭,我需要重新连接,但我的代码不会针对这种关闭的连接抛出任何异常,看起来连接仍处于活跃状态但不再接收数据。请问如何判断连接何时断开?

我的代码:

try:
    response = requests.get(url, stream=True)

    response.raise_for_status()

    for line in response.iter_lines():
        if line:
            print(line)
        else:
          print("No data returned.")

except requests.exceptions.RequestException as e:
    print("Error connection:", e)
解决方案
  • 检测迭代器终止:response.iter_lines()在连接正常关闭时会耗尽迭代器,循环会自然退出。正常的活跃流不会主动终止迭代,所以一旦循环结束,就说明连接已经断开,可直接触发重连逻辑。
  • 设置读取超时:给请求添加timeout参数,比如requests.get(url, stream=True, timeout=(5, 30)),第一个值是连接超时时间,第二个是读取超时时间(多久没收到数据就抛出异常)。这样长时间无数据时会触发ReadTimeout异常,在except块中捕获即可处理重连。
  • 添加数据心跳检测:记录最后一次收到数据的时间,每隔一段时间检查时间差,若超过设定阈值(比如60秒),就主动判定连接断开并触发重连。如果API本身支持心跳包,也可以通过等待心跳响应来验证连接状态。
  • 捕获底层连接异常:除了RequestException,额外捕获ConnectionError、BrokenPipeError等底层异常,覆盖更多连接意外断开的场景。

修改后的示例代码:

import time
import requests

def connect_api_stream(url):
    while True:
        try:
            # 设置5秒连接超时,30秒读取超时
            response = requests.get(url, stream=True, timeout=(5, 30))
            response.raise_for_status()
            
            last_data_ts = time.time()
            for line in response.iter_lines():
                if line:
                    print(line)
                    last_data_ts = time.time()
                # 检查是否超过1分钟未收到数据
                if time.time() - last_data_ts > 60:
                    print("长时间未收到数据,判定连接断开")
                    break
            
            print("连接已关闭,准备重连")
        except requests.exceptions.RequestException as e:
            print(f"连接异常:{e},准备重连")
        except (ConnectionError, BrokenPipeError) as e:
            print(f"底层连接错误:{e},准备重连")
        # 重连前短暂延迟,避免频繁请求
        time.sleep(2)

# 调用示例
connect_api_stream("你的API地址")

内容的提问来源于stack exchange,提问作者Adriano Casimiro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 00:16:09