requests请求超时尝试重连的3种方式
参考文档
https://urllib3.readthedocs.io/en/latest/reference/urllib3.util.html#module-urllib3.util.retry
https://blog.csdn.net/shengruxiahua2571/article/details/103165315/
了解
连接超时 ==> 发起请求连接到建立连接之间的最大时长
读取超时 ==> 连接成功开始到服务器返回响应之间等待的最大时长
代码示例
import traceback
import time
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
retries = Retry(total=3,
backoff_factor=0.1,
status_forcelist=[ 500, 502, 503, 504 ])
s = requests.Session()
s.mount('http://', HTTPAdapter(max_retries=retries))
s.mount('https://', HTTPAdapter(max_retries=retries))
count = 0
while True:
if count < 3:
try:
file = s.get(url, stream=True, timeout=5)
return file.content
except:
print('Retry!')
time.sleep(3)
traceback.print_exc()
count += 1
continue
else:
print('Fail!')
break
# 相关Retry参数说明
total 允许的重试次数
connect 要重试的连接相关错误数
read 读取错误时重试多少次
redirect 要执行的重定向数
status_forcelist 一组我们应该强制重试的HTTP状态代码
backoff_factor 在第二次尝试后在尝试之间应用的退避因素(大多数错误会立即通过第二次尝试解决,没有延迟)
raise_on_redirect 如果重定向次数用尽,是否引发 MaxRetryError 或返回响应代码在 3xx 范围内的响应。
raise_on_status 类似于raise_on_redirect:如果状态在status_forcelist范围内并且重试已经用尽,我们是否应该引发异常或返回响应。
结合项目需求使用的两种方法
方法一,普通循环请求判断
def connection_demo(self, request):
start_time = datetime.now()
while True:
... # 省略其它代码部分
num_times = 0
session = requests.Session() # 推荐使用session可以提高访问速度
while num_times < 3:
try:
result = session.get(url=url, verify=False, timeout=5)
if result.status_code == 200:
break
except requests.exceptions.RequestException: # 如果HTTP请求返回了不成功的状态码, Response.raise_for_status() 会抛出一个 HTTPError 异常
num_times += 1
continue
if num_times < 3:
break
else:
raise VtuneTimeOutException
... # 省略其它代码部分
return redirect_url
方法二,requests的retry
import requests
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
def connection_demo(self, request):
start_time = datetime.now()
while True:
... # 省略其余代码部分
req = requests.Session()
retries = Retry(total=3,
backoff_factor=0.1,
status_forcelist=[500, 502, 503, 504])
req.mount('https://', HTTPAdapter(max_retries=retries))
try:
result = req.get(url=url, verify=False, timeout=5)
if result.status_code == 200:
break
else:
raise VtuneTimeOutException
except requests.exceptions.RequestException:
raise VtuneTimeOutException
... # 省略其余代码部分
return redirect_url
方法3,装饰器retry
pip install retry
自行百度
总结
需求是:后端视图代码请求由内部生成并存储到数据库中的一个url,看是否通再将url返回给前端,3次重连,根据requests的status_code为200来判断是否成功,
状态码200成功则结束,其它状态码不成功则继续,
并且在3次重连内,有超时等问题都不希望让其抛出错误,等3次重连结束后,再判断是否都不成功再抛出错误。使用第二种方法有点小bug,
具体还是要结合项目,之前没有加status_forcelist这个玩意,导致有一次请求得到503,页面报错了,但是因为有三次重连的机制,
报错了还继续执行成功了。所以后面加了status_forcelist,但是还有异常捕获的问题,因为只要有一次超时或其它问题,
都会被捕获抛异常,那样也会遇到报错了还继续执行成功了的问题。
所以我使用了第一种方式写法,当然了还是要结合项目需求来。
requests请求超时尝试重连的3种方式的更多相关文章
- Java设置session超时(失效)的三种方式
1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置: <!-- ================= ...
- 导致flash屏幕重绘的几种方式及避免重绘的方法
导致屏幕重绘的几种原因: 1.最常见的是情况就是舞台上的可视组件在形状.位置.状态(alpha, scale…)发生改变的时候会触发Flash Player 的重绘. 2.当一个DisplayObje ...
- ASP.NET问题处理---“数据请求超时错误“”
数据请求超时,一般有2中解决方式: 1.页面AJAX处理数据时延长时间: 2.后台数据库连接取数据时延长时间. 由于我的后台数据库连接取数据为循环读取数据,所以不存在超时问题,这里具体说说如何修改AJ ...
- 比较两种方式的form请求提交
[一]浏览器form表单提交 表单提交, 适用于浏览器提交.像常见的pc端的网银支付,用户在商户商城购买商品,支付时商家系统把交易数据通过form表单提交到三方支付网关,然后用户在三方网关页面完成支付 ...
- Python爬虫requests判断请求超时并重新发送请求
下面是简单的一个重复请求过程,更高级更简单的请移步本博客: https://www.cnblogs.com/fanjp666888/p/9796943.html 在爬虫的执行当中,总会遇到请求连接 ...
- python+requests 请求响应文本出错返回“登录超时”
Python+requests请求响应:"msg":"登录过时" 1.出错原代码: import requests import json#页面按条件搜索返回相 ...
- Dubbo超时和重连机制
dubbo启动时默认有重试机制和超时机制.超时机制的规则是如果在一定的时间内,provider没有返回,则认为本次调用失败,重试机制在出现调用失败时,会再次调用.如果在配置的调用次数内都失败,则认为此 ...
- python requests请求卡住问题
最近经常接到别人反馈某个爬虫工具程序没有正常运行,需要下载的资讯数据也没有及时进行收录. 刚开始以为可能是机器的问题,偶尔机器会出现程序运行中途卡住的情况. 但随着异常的情况越来越频繁,我便只好去排查 ...
- HTTP 408请求超时错误解决办法
错误描述 对于大多数网站而言,我们所看到的错误消息已经是开发者定制过的页面,比如我们最常见的自定义404错误页面,一般而言,我们看到的408错误应该是类似这样的提示:“408:Request Time ...
- SQL Server 磁盘请求超时的833错误原因分析以及解决
本文出处:http://www.cnblogs.com/wy123/p/6984885.html 最近遇到一个SQL Server服务器响应极度缓慢,并且出现客户端请求报错的情况,在数据库中的erro ...
随机推荐
- [转帖]Innodb存储引擎-备份和恢复(分类、冷备、热备、逻辑备份、二进制日志备份和恢复、快照备份、复制)
文章目录 备份和恢复 分类 冷备 热备 逻辑备份 mysqldump SELECT...INTO OUTFILE 恢复 二进制日志备份与恢复 快照备份(完全备份) 复制 快照+复制的备份架构 备份和恢 ...
- Find -mtime 的图解
- React中函数组件与类组件的两种使用
React 创建组件的两种方式 函数组件:使用js函数创建的组件 约定1:函数名称必须以大写字母开头 约定2:函数组件必须要有返回值. 如果返回值为null.表示不渲染任何内容. return nul ...
- 批量修改SVN的用户名和密码的尝试
起源 公司规定每6个月需要修改一次密码,否则每天都有邮件和内网提醒.因为邮箱密码和svn等一系列应用绑定,避免每次修改密码后需要手工输入修改多个svn仓库的帐号和密码. PS.同一个前缀的svn不用重 ...
- 【操作系统到计网从入门到深入】(一)Linux基础知识预备
前言 这个专栏其实是博主在复习操作系统和计算机网络时候的笔记,所以如果是博主比较熟悉的知识点,博主可能就直接跳过了,但是所有重要的知识点,在这个专栏里面都会提到!而且我也一定会保证这个专栏知识点的完整 ...
- 【算法】基于hoare快速排序的三种思想和非递归,基准值选取优化【快速排序的深度剖析-超级详细的注释和解释】你真的完全学会快速排序了吗?
文章目录 前言 什么是快速排序 快速排序的递归实现 快速排序的非递归实现 单趟排序详解 hoare思想 挖坑法 前后指针法 快速排序的优化 三数取中 小区间优化 快速排序整体代码 尾声 前言 先赞后看 ...
- Qt processEvents - 解决线程中事件阻塞(如槽函数被阻塞)
百度了一会,发现没太有文字讲这件事情,因此整理成文字记录一下. processEvents介绍 长时间运行的操作可以调用processEvents() 保持应用程序响应能力. void QCoreAp ...
- 关于DbgridEh滚动从表一起跟着滚动的分析
我的实现:
- 《ASP.ENT Core 与 RESTful API 开发实战》-- (第6章)-- 读书笔记(上)
第 6 章 高级查询和日志 6.1 分页 在 EF Core 中,数据的查询通过集成语言查询(LINQ)实现,它支持强类型,支持对 DbContext 派生类的 DbSet 类型成员进行访问,DbSe ...
- 【译】.NET 8 网络改进(三)
原文 | Máňa,Natalia Kondratyeva 翻译 | 郑子铭 简化的 SocketsHttpHandler 配置 .NET 8 添加了更方便.更流畅的方式来使用 SocketsHttp ...