当前位置:
首页 > Python基础教程 >
-
python脚本请求数量达到上限,http请求重试问题
这篇文章主要介绍了python脚本请求数量达到上限,http请求重试问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
python请求数量达到上限,http请求重试
由于在内网发送http请求同一个token会限制次数,所以很容易达到网关流量上限。
业务中使用了多线程并发,一个线程发起一次http请求,得到正确结果后返回。
这里采用的策略是,如果解析出来达到流量上限,那么该线程休眠一段时间,然后重试请求,如果还是失败,那么继续休眠,每次休眠的时间随着重试轮次增加:
# 探测是否触及网关流量上限
def probe_func(m_url, m_headers, m_json, m_timeout):
json_rep = requests.post(url = m_url,
headers = m_headers,
json = m_json,
timeout = m_timeout)
zhiyan_data = json_rep.json()
if(zhiyan_data['code'] != 0):
return None
else:
return json_rep
# 解析数据包,不涉及probe_func中的检测内容
def parse(json_rep, room_name, metric_name):
if json_rep == None:
logging.info(room_name + " json_rep == None")
return 0
if (json_rep.content and json_rep.status_code != 204 and json_rep.headers["content-type"].strip().startswith("application/json")):
zhiyan_data = json_rep.json()
if len(zhiyan_data['data']) == 0:
logging.warning(zhiyan_data['日志信息拉取无结果'])
return 0
else:
res = zhiyan_data['data']['chart_info'][0]['key_data_list'][3]['current']
logging.info(room_name + str(res))
if str(res) == "None":
logging.warning(room_name + ":拉取zhiyan_data:" + metric_name + " 出现了问题,拉取数据为None")
return 0
else:
return res
else:
return 0
# 具有可靠性地获取数据
def request_post_reliable(m_url, m_headers, m_json, m_timeout):
sleep_time_s = 1
sleep_time_max = 60
res = probe_func(m_url, m_headers, m_json, m_timeout)
# 如果探测失败则线程睡眠一段时间后再尝试
while (res == None):
logging.info("探测失败,线程睡眠"+str(sleep_time_s)+"秒")
time.sleep(sleep_time_s)
tmp = sleep_time_s * 2
if tmp < sleep_time_max:
sleep_time_s = tmp
else:
sleep_time_s = sleep_time_max
logging.info("睡眠结束,线程重新探测")
res = probe_func(m_url, m_headers, m_json, m_timeout)
# 直到探测成功,返回正确结果
return res
python请求http/https时设置失败重试次数
使用Python的requests库时,默认是没有失败时重试请求的,通过下面的方式可以支持重试请求
设置请求时的重试规则
import requests
from requests.adapters import HTTPAdapter
s = requests.Session()
a = HTTPAdapter(max_retries=3)
b = HTTPAdapter(max_retries=3)
#将重试规则挂载到http和https请求
s.mount('http://', a)
s.mount('https://', b)
请求Url
上面设置完毕后,通过改Session的请求就可以支持失败重试
r = s.get('http://api.map.baidu.com/geocoder?location=39.90733345,116.391244079988&output=json')
# 返回的状态码
r.status_code
# 响应内容,中文为utf8编码
r.content
# 响应的字符串形式,中文为unicode编码
r.text
# 响应头中的编码
r.encoding
# 响应头信息
r.headers
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持
原文链接:https://blog.csdn.net/qq_42604176/article/details/123794075
栏目列表
最新更新
vbscript基础篇 - vbs数组Array的定义与使用方
vbscript基础篇 - vbs变量定义与使用方法
vbs能调用的系统对象小结
vbscript网页模拟登录效果代码
VBScript 根据IE窗口的标题输出ESC
杀死指定进程名称的小VBS
通过vbs修改以点结尾的文件的属性为隐藏
查询电脑开关机时间的vbs代码
VBA中的Timer函数用法
ComboBox 控件的用法教程
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比