登录
首页 >  文章 >  python教程

Python请求超时错误处理与解决方法

时间:2026-03-21 15:53:47 491浏览 收藏

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

Python请求超时错误TimeoutError处理与优化方法

Python中使用requests库发起网络请求时,经常会遇到TimeoutErrorrequests.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. 使用重试机制增强鲁棒性

临时网络抖动可能导致超时,引入重试可提高成功率:

  • 使用urllib3Retry类配合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编程的知识点!

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>