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

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}")

代码优化建议

  1. 配置化管理服务器地址:把服务器URL/地址放在单独的列表(甚至配置文件)里,不要硬编码,后续新增/修改服务器时更方便。
  2. 用日志代替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}超时")
    
  3. 并发处理提高效率:如果4台服务器的请求都要等响应,同步遍历会比较慢。新手可以先掌握同步逻辑,之后可以尝试用threading(多线程)或者aiohttp(异步)实现并发请求,大幅缩短总耗时。
  4. 异常分类要精准:尽量捕获具体的异常类型(比如requests.exceptions.Timeout),而不是笼统的Exception,这样能更准确地判断错误原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:38:06