Python HTTP连接超时处理求助:多Web服务器状态读取问题
处理多储罐Web服务器超时&代码优化方案
嘿,作为Python新手碰到超时处理和多服务器遍历的问题太正常了,我来帮你捋清楚怎么搞定,顺便给你一些代码优化的建议!你的需求很明确:连接4台监控流体罐的Web服务器,遇到超时/不存在的服务器时记录错误,继续处理剩下的。咱们一步步来:
核心思路:异常捕获+循环遍历
要实现“出错不中断”的效果,关键是把每个服务器的请求逻辑放在try-except块里,这样单个请求的错误不会终止整个程序。同时要给每个请求设置明确的超时时间,避免程序无限等待。
方案1:用标准库http.client实现(无需额外安装)
如果不想装第三方库,用Python自带的http.client也能搞定,搭配socket.timeout捕获超时异常:
import http.client import socket # 先把服务器地址整理成列表,方便遍历(替换成你的实际地址) tank_servers = [ "tank-monitor-1.local", "tank-monitor-2.local", "tank-monitor-3.local", "tank-monitor-4.local" ] active_tanks = len(tank_servers) my_tanks = [] # 用来存储每个储罐的状态/错误信息 for server in tank_servers: try: # 创建连接时设置超时(比如5秒,可根据实际调整) conn = http.client.HTTPConnection(server, timeout=5) # 发送GET请求到状态接口(替换成你的实际接口路径,比如"/tank/status") conn.request("GET", "/status") response = conn.getresponse() # 解析响应(这里假设返回的是字符串格式的状态数据,比如液位值) if response.status == 200: tank_status = response.read().decode("utf-8") my_tanks.append(tank_status) print(f✅ 成功获取{server}状态: {tank_status}") else: my_tanks.append(f"HTTP错误: {response.status}") print(f❌ {server}返回错误状态码: {response.status}") conn.close() # 记得关闭连接 except socket.timeout: # 捕获超时异常 my_tanks.append("超时") print(f⏳ 连接{server}超时,跳过") except ConnectionRefusedError: # 捕获服务器不存在/拒绝连接的情况 my_tanks.append("连接被拒绝") print(f❌ {server}拒绝连接,可能不存在") except Exception as e: # 兜底捕获其他未知错误 error_msg = f"未知错误: {str(e)}" my_tanks.append(error_msg) print(f❌ 连接{server}时出错: {error_msg}") # 最后输出所有结果 print("\n📊 所有储罐状态汇总:") for idx, status in enumerate(my_tanks, 1): print(f"储罐{idx}: {status}")
方案2:用requests库实现(更简洁友好)
如果你能安装第三方库,强烈推荐requests——它比http.client易用太多,异常处理也更直观。先安装:
pip install requests
然后是代码示例:
import requests # 直接把完整的接口URL放在列表里,更清晰 tank_urls = [ "http://tank-monitor-1.local/status", "http://tank-monitor-2.local/status", "http://tank-monitor-3.local/status", "http://tank-monitor-4.local/status" ] my_tanks = [] for url in tank_urls: try: # 设置超时时间(连接超时+读取超时,这里统一设为5秒) response = requests.get(url, timeout=5) response.raise_for_status() # 自动抛出HTTP错误(比如404、500) tank_status = response.text my_tanks.append(tank_status) print(f✅ 成功获取{url}状态: {tank_status}") except requests.exceptions.Timeout: my_tanks.append("超时") print(f⏳ 请求{url}超时") except requests.exceptions.ConnectionError: my_tanks.append("无法连接") print(f❌ 无法连接到{url},服务器可能不存在") except requests.exceptions.HTTPError as e: error_msg = f"HTTP错误: {e}" my_tanks.append(error_msg) print(f❌ {url}返回错误: {error_msg}") except Exception as e: error_msg = f"未知错误: {str(e)}" my_tanks.append(error_msg) print(f❌ 请求{url}时出错: {error_msg}") # 汇总输出 print("\n📊 所有储罐状态汇总:") for idx, status in enumerate(my_tanks, 1): print(f"储罐{idx}: {status}")
代码优化建议
- 配置化管理服务器地址:把服务器URL/地址放在单独的列表(甚至配置文件)里,不要硬编码,后续新增/修改服务器时更方便。
- 用日志代替print:如果是长期运行的监控程序,建议用Python的
logging模块代替print,可以把错误记录到文件,方便后续排查:import logging # 配置日志输出到文件 logging.basicConfig( filename="tank_monitor.log", level=logging.INFO, format="%(asctime)s - %(levelname)s - %(message)s" ) # 然后把print换成logging.info/logging.error logging.info(f"成功获取{url}状态: {tank_status}") logging.error(f"请求{url}超时") - 并发处理提高效率:如果4台服务器的请求都要等响应,同步遍历会比较慢。新手可以先掌握同步逻辑,之后可以尝试用
threading(多线程)或者aiohttp(异步)实现并发请求,大幅缩短总耗时。 - 异常分类要精准:尽量捕获具体的异常类型(比如
requests.exceptions.Timeout),而不是笼统的Exception,这样能更准确地判断错误原因。
内容的提问来源于stack exchange,提问作者Gowfster
相关产品推荐
相关产品推荐

