【发布时间】:2022-01-20 19:18:17
【问题描述】:
我使用包requests 和urllib3.util.retry.Retry() 一起发送数以万计的查询。我试图计算查询的数量和必要的尝试次数,直到我成功检索到所需的数据。我的目标是构建 API 可靠性的衡量标准。
为了修正想法,我们假设requests 的 Response 对象包含以下数据:
from requests import Session
from urllib3.util.retry import Retry
from requests.adapters import HTTPAdapter
def create_session():
session = Session()
retries = Retry(
total = 15,
backoff_factor = 0.5,
status_forcelist = [401, 408, 429, 500, 502, 504],
allowed_methods = frozenset(["GET"])
)
session.mount('http://', HTTPAdapter(max_retries=retries))
session.mount('https://', HTTPAdapter(max_retries=retries))
return session
urls = ['https://httpbin.org/status/500']
count_queries = len(urls)
count_attempts = 0
with create_session() as s:
for url in urls:
response = s.get(url)
count_attempts += response.total_retries
由于没有这样的变量,我正在寻找替代方法来计算重试总数。
虽然我无法确定解决此问题的方法,但我在搜索过程中进行了以下观察,这可能会有所帮助:
-
urllib3将重试历史存储在 Retry 对象中。urllib3.HTTPResponse存储最后一个重试对象 (docs)。urllib3.HTTPResponse(准确地说,它的未解码主体)存储在requests.Response.raw中,但仅在stream=True(docs) 中。据我了解,我无法访问这些数据。 - 一位用户为similar question 提供了一个解决方案,该解决方案是
Retry类的子类。本质上,调用回调函数将字符串打印到记录器。这可以适应增加计数器而不是打印到日志。但是,如果可能,我更喜欢跟踪特定get的重试次数,如上所示,而不是使用同一会话的所有gets。 - here 提出了一个非常相似的问题,但没有提供(有效的)解决方案。
我正在使用 Python 3.9,urllib3 1.26.8,请求 2.26.0。
【问题讨论】:
标签: python python-requests urllib3