如何通过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
相关产品推荐
相关产品推荐

