讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 网络超时与重试机制设计

夏浩吖_2767

夏浩吖_2767

发布时间:2026-01-31 18:28:04

|

260人浏览过

|

来源于php中文网

原创

requests默认timeout为None易致线程卡死,须显式设为(connect_timeout, read_timeout);urllib3 Retry需开启connect/read/status并限制方法;应精细捕获异常,避免重试客户端错误;aiohttp需用ClientTimeout分项设置并手动实现带退避的异步重试。

python 网络超时与重试机制设计

requests 默认超时行为为什么不能直接用

requests 发起 HTTP 请求时,timeout 参数默认是 None,意味着底层 socket 会一直等下去,直到服务器响应或网络断开。这在生产环境极易导致线程卡死、连接堆积、服务雪崩。必须显式设置 timeout,且建议拆分为 (connect_timeout, read_timeout) 两个值——前者控制建立 TCP 连接的最长等待时间,后者控制从 socket 读取响应体的单次等待上限。

常见错误是只写一个数字,比如 timeout=5,它等价于 timeout=(5, 5),但实际中连接慢和响应慢的场景完全不同:DNS 解析失败、目标服务器宕机通常卡在 connect 阶段;而大文件流式返回、后端计算耗时则卡在 read 阶段。应按需分离,例如 timeout=(3, 10)。

urllib3 Retry 对象怎么配才不白配

requests 底层用 urllib3,其 Retry 类控制重试逻辑。但直接传 retry=Retry(total=3) 很可能无效——因为默认只对 status(如 502/503/504)和 connect 错误重试,而不会重试 read 超时(ReadTimeoutError)或 DNS 失败(MaxRetryError caused by NameResolutionError)。

要覆盖常见网络异常,需显式开启:

立即学习“Python免费学习笔记(深入)”;

  • connect=True:重试连接失败(含 DNS、拒绝连接等)
  • read=True:重试读取超时(ReadTimeoutError)
  • status=True:重试服务端返回的 5xx 响应
  • allowed_methods=frozenset(['GET', 'HEAD', 'OPTIONS']):避免对 POST 等非幂等方法盲目重试
  • backoff_factor=0.3:每次重试前按指数退避,例如第 1 次延 0.3s,第 2 次延 0.6s,第 3 次延 1.2s

完整示例:

from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

retry_strategy = Retry(
    total=3,
    connect=True,
    read=True,
    status=True,
    allowed_methods=frozenset(['GET', 'HEAD', 'OPTIONS']),
    backoff_factor=0.3
)
adapter = HTTPAdapter(max_retries=retry_strategy)
session = requests.Session()
session.mount("http://", adapter)
session.mount("https://", adapter)

如何识别并跳过不该重试的错误

不是所有异常都适合重试。比如 ConnectionError 中的 CertificateError(证书过期)、InvalidURL(URL 格式错误)、TooManyRedirects(重定向环),重试只会重复失败。同样,400 Bad Request、401 Unauthorized、403 Forbidden、404 Not Found 属于客户端问题,重试无意义。

Remix V2 Meta Sessions Review
Remix V2 Meta Sessions Review

审查 Remix v2 代码中的 v1 形态 meta 导出(v2 中为破坏性变更),cookie 安全漏洞(httpOnly、secure、密钥轮换),认证门位于错误层级,以及其他

下载

推荐做法是在 except 块中精细捕获:

  • 对 requests.exceptions.Timeout、requests.exceptions.ConnectionError(仅限底层网络类子类,如 ConnectTimeout、ReadTimeout、NewConnectionError)做重试
  • 对 requests.exceptions.HTTPError 判断 response.status_code // 100 == 5 再决定是否重试
  • 其他异常直接抛出,不吞掉也不重试

注意:requests.exceptions.RequestException 是顶层基类,直接捕获它会掩盖本该终止的错误。

异步场景下 aiohttp 的 timeout 和 retry 怎么设

aiohttp 不内置重试,timeout 必须通过 aiohttp.ClientTimeout 实例传入,且不能只设一个总时间。它有四个关键字段:total(整个请求生命周期)、connect(TCP 连接建立)、sock_read(socket 读取单块数据)、sock_connect(DNS + TCP 握手)。其中 total 和 sock_read 最常用,例如 ClientTimeout(total=15, sock_read=10)。

重试需手动实现,常见模式是用 async for 或 for 循环 + try/except,但要注意:

  • 每次重试都应新建 aiohttp.ClientSession() 或确保 session 未关闭
  • 避免在重试循环中使用 time.sleep(),改用 await asyncio.sleep()
  • 不要对 ClientConnectorError(如 DNS 失败)和 ServerDisconnectedError 盲目重试,它们可能反映下游服务已不可达

真正容易被忽略的是:aiohttp 的 timeout 在 DNS 解析阶段就生效,而某些 DNS 缓存失效或递归查询慢的环境,sock_connect 可能卡住数秒——这个时间会计入 total,导致还没发包就超时。必要时可单独调大 sock_connect。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

580

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

876

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

1946

2025.08.19

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

6467

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

2688

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4558

2023.08.10

http500解决方法
http500解决方法

http500解决方法有检查服务器日志、检查代码错误、检查服务器配置、检查文件和目录权限、检查资源不足、更新软件版本、重启服务器或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3803

2023.11.09

http请求415错误怎么解决
http请求415错误怎么解决

解决方法:1、检查请求头中的Content-Type;2、检查请求体中的数据格式;3、使用适当的编码格式;4、使用适当的请求方法;5、检查服务器端的支持情况。更多http请求415错误怎么解决的相关内容,可以阅读下面的文章。

954

2023.11.14

Uvicorn 报错与问题解决教程
Uvicorn 报错与问题解决教程

本专题汇总了Uvicorn服务器常见问题与报错解决的教程合集,涵盖启动失败、端口占用、模块导入错误、事件循环冲突及热重载失效等典型故障的排查思路。同时整理了多进程与Worker配置、SSL/HTTPS证书报错、跨域与代理配置等实战解决方案,助你快速定位并解决Uvicorn运行中的各类问题。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Uvicorn官方安装与入门手册
Uvicorn官方安装与入门手册

共0课时 | 0人学习

Python uv官方项目管理指南
Python uv官方项目管理指南

共0课时 | 0人学习

Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn