Python requests.get请求卡顿:局域网温感数据读取脚本异常排查
解决Python脚本读取局域网温度数据时卡住的问题
我之前也碰到过一模一样的情况!你的脚本毫无征兆卡住的核心原因其实很直白:requests.get()方法默认没有设置超时时间。当局域网里的服务器偶尔响应慢、临时掉线,或者请求半路丢包时,requests会一直傻等服务器的回复,直接导致脚本僵住无响应。
快速修复方案
给requests.get()加上超时参数,同时增加异常处理逻辑,这样即使遇到问题,脚本也不会卡住,还能继续循环执行。修改后的代码如下:
import requests import time while True: s = time.time() try: # 设置超时时间,这里设3秒(可根据局域网稳定性调整) r = requests.get("http://192.168.1.2/readtemp.php?id=1&action=read", timeout=3) # 确保请求成功(状态码为200) r.raise_for_status() temp = r.text print(f"{temp} - {time.time() - s:.6f} Seconds") except requests.exceptions.RequestException as e: # 捕获所有请求相关异常,打印错误信息不中断脚本 print(f"请求出错: {str(e)} - 耗时: {time.time() - s:.6f} Seconds") time.sleep(2)
关键改动说明
- 添加
timeout参数:我这里设了3秒,你可以根据局域网的实际情况调整(比如2-5秒都合适)。超过这个时间没收到响应,requests会直接抛出超时异常,不会一直挂着占用资源。 - 异常捕获:用
try-except包裹请求逻辑,不管是超时、网络断开还是服务器返回错误状态码(比如500、404),都会触发异常处理,脚本可以继续下一次循环,不会崩溃或卡住。 r.raise_for_status():用来检查请求是否成功,如果服务器返回错误状态码,会主动抛出异常,避免我们处理无效的响应内容。
额外优化小技巧
- 如果服务器偶尔抽风,可以加个简单的重试逻辑,比如连续失败2次再跳过:
retry_count = 0 while retry_count < 2: try: r = requests.get("http://192.168.1.2/readtemp.php?id=1&action=read", timeout=3) r.raise_for_status() temp = r.text print(f"{temp} - {time.time() - s:.6f} Seconds") break except requests.exceptions.RequestException as e: retry_count +=1 print(f"重试第{retry_count}次,错误: {str(e)}") time.sleep(1) - 可以用
logging模块替代print记录错误信息到文件,方便后续排查服务器不稳定的原因。
内容的提问来源于stack exchange,提问作者M. Serseg
相关产品推荐
相关产品推荐

