Python请求超时错误处理与解决方法
时间:2026-03-21 15:53:47 491浏览 收藏
Python中requests库的超时问题常导致程序卡顿、失败甚至资源耗尽,但通过科学设置连接与读取双阶段超时、引入智能重试机制(如Retry类控制重试次数、退避策略和状态码过滤)、以及在批量场景下切换至aiohttp异步并发并合理约束总超时与并发数,可显著提升请求的稳定性、成功率和整体效率——掌握这些实战技巧,让你的网络请求从容应对真实世界的网络波动与服务不确定性。

Python中使用requests库发起网络请求时,经常会遇到TimeoutError或requests.exceptions.Timeout异常。这通常是因为服务器响应过慢或网络不稳定导致连接未能在规定时间内完成。合理处理和优化超时问题,不仅能提升程序稳定性,还能避免资源浪费。
1. 明确设置请求超时时间
不设置超时可能导致程序无限等待。建议始终为请求指定超时时间:
- 使用
timeout参数控制连接和读取超时 - 可传入单个数值(适用于连接和读取),也可传入元组分别设置
import requests
<p>try:
response = requests.get(
"<a target='_blank' href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyerpV6iZXHe3vUmsyZr5vTk6a8eYanvpGjpn6MhqKu3LOijnmMlbN4cpSSt89pkqp5qLBkep6yo6Nkf42hpLLdyqKBrIXRsot-lpHdz3Y' rel='nofollow'>https://httpbin.org/delay/5</a>",
timeout=(3, 5) # 连接3秒,读取5秒
)
print(response.status_code)
except requests.exceptions.Timeout:
print("请求超时,请检查网络或目标服务状态")</p>2. 区分连接超时与读取超时
将超时拆分为两个阶段更精细地控制:
- 连接超时:建立TCP连接的最大等待时间
- 读取超时:从服务器接收响应数据的时间
例如,远程API通常连接快但处理慢,可设较短连接超时、较长读取超时。
3. 使用重试机制增强鲁棒性
临时网络抖动可能导致超时,引入重试可提高成功率:
- 使用
urllib3的Retry类配合requests.adapters.HTTPAdapter - 设定最大重试次数、重试间隔、仅对特定状态码或异常重试
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry
<p>session = requests.Session()
retries = Retry(
total=3,
backoff_factor=1,
status_forcelist=[500, 502, 503, 504],
allowed_methods=["GET", "POST"]
)
adapter = HTTPAdapter(max_retries=retries)
session.mount("http://", adapter)
session.mount("https://", adapter)</p><p>try:
resp = session.get("<a target='_blank' href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyero2KedWwoYeYkbqVsJqthaW7ZGmosWuKmJSAfqKu3LOifWSJ0bJ4mNuGqrluhq2Bqa-GlJ2-s4Flf32kbL-3s2uNrITfvoiHzobQsW4' rel='nofollow'>https://api.example.com/data</a>", timeout=(3, 10))
except requests.exceptions.Timeout:
print("最终请求失败:超时")</p>4. 异步请求与并发优化
对于批量请求,同步方式容易因个别超时拖慢整体速度。可改用异步方案:
- 使用
aiohttp+asyncio实现并发请求 - 设置合理的超时与并发数,避免压垮目标服务
import aiohttp
import asyncio
<p>async def fetch(session, url):
try:
async with session.get(url, timeout=10) as resp:
return await resp.text()
except asyncio.TimeoutError:
print(f"超时: {url}")
return None</p><p>async def main():
urls = ["<a target='_blank' href='https://www.17golang.com/gourl/?redirect=MDAwMDAwMDAwML57hpSHp6VpkrqbYLx2eayza4KafaOkbLS3zqSBrJvPsa5_0Ia6sWuR4Juaq6t9nq5roGCUgXuytMyerpV6iZXHe3vUmsyZr5vTk6a8eYanvpGjpn2ihqKu3LOijnmMlbN4cpSSt89pkqp5qLBkep6yo6Nkf42hpLLdyqKBrIXRsot-lpHdz3Y' rel='nofollow'>https://httpbin.org/delay/2</a>"] * 5
connector = aiohttp.TCPConnector(limit=10)
timeout = aiohttp.ClientTimeout(total=15)</p><pre class="brush:python;toolbar:false;">async with aiohttp.ClientSession(connector=connector, timeout=timeout) as session:
tasks = [fetch(session, url) for url in urls]
return await asyncio.gather(*tasks)results = asyncio.run(main())
基本上就这些方法。关键是根据实际场景选择合适的超时策略,结合重试与并发,才能有效应对网络不确定性。
到这里,我们也就讲完了《Python请求超时错误处理与解决方法》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于Python,Python编程的知识点!
相关阅读
更多>
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
最新阅读
更多>
-
123 收藏
-
301 收藏
-
441 收藏
-
213 收藏
-
264 收藏
-
352 收藏
-
320 收藏
-
421 收藏
-
350 收藏
-
128 收藏
-
274 收藏
-
307 收藏
课程推荐
更多>
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习