我使用
为了明确问题,假设
requests
包和urllib3.util.retry.Retry()
一起发送数以万计的查询。我想要计算查询的数量和成功检索所需尝试的次数。我的目标是构建一个API可靠性的度量标准。为了明确问题,假设
requests
的响应对象包含以下数据: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对象中。最后的Retry对象存储在urllib3.HTTPResponse
中(文档)。requests.Response.raw
存储urllib3.HTTPResponse
(确切地说是未解码的正文),但仅当stream=True
时可以访问(文档)。 在我的理解中,我无法访问此数据。- 一位用户提供了一个解决类似问题的方案,该方案对Retry类进行了子类化。 基本上,调用回调函数会向记录器打印一个字符串。 这可以改为递增计数器而不是打印日志。 但是,如果可能的话,我更喜欢跟踪特定于特定
get
的重试,如上所示,而不是使用相同会话的所有get
。 - 这里问了一个非常类似的问题,但没有提供(可行的)解决方案。
我正在使用Python 3.9、urllib3 1.26.8和requests 2.26.0。