我想在重试之间使用静态时间,而不是 urllib3 Retry 类中的指数退避因子。
我尝试包装 Retry 类来实现静态重试。然而,虽然
LoggingRetry
正在使用适当的参数进行实例化,但在实际重试发生时将使用默认值。在下面的示例中,重试之间应该有两秒钟的时间。
backoff_factor
会持续存在,但我似乎无法让
delay_between_retries
坚持下去。
谢谢。
import time
import urllib3
from urllib3.util.retry import Retry
from urllib3.exceptions import MaxRetryError
from requests. exceptions import HTTPError
import traceback
# Define the retry strategy with logging
class LoggingRetry(Retry):
def __init__(self, delay_between_retries=0, *args, **kwargs):
print(f"Initializing LoggingRetry with delay_between_retries={delay_between_retries}")
self.delay_between_retries = delay_between_retries
super().__init__(*args, **kwargs)
def sleep(self, response=None):
backoff = self.get_backoff_time()
total_sleep_time = self.delay_between_retries + backoff
print(f"LoggingRetry sleep - delay_between_retries: {self.delay_between_retries}, Backoff time: {backoff}")
time.sleep(total_sleep_time)
class MyClient:
def __init__(self, total_tries=3, delay_between_retries=0, backoff_factor=0):
self.total_tries = total_tries
self.delay_between_retries = delay_between_retries
self.backoff_factor = backoff_factor
# Define a retry strategy with a custom fixed_wait_time
self.retry_strategy = LoggingRetry(
total=self.total_tries,
status_forcelist=[202],
backoff_factor=self.backoff_factor,
delay_between_retries=self.delay_between_retries,
raise_on_status=False,
allowed_methods=frozenset(['POST'])
)
# Initialize HTTP client with retry strategy
self.http = urllib3.PoolManager(retries=self.retry_strategy, maxsize=4, block=True)
def request_data(self, url):
try:
response = self.http.request('GET', url,)
return response
except MaxRetryError as me:
print(f"Max retries reached: {me}")
except HTTPError as he:
print(f"An HTTP error occurred: {he}")
traceback.print_exc()
except Exception as e:
print(f"An error occurred: {e}")
traceback.print_exc()
MyClient(delay_between_retries=2, backoff_factor=0).request_data(url='http://0.0.0.202/')
当然可以,我可以帮解决这个问题。对
urllib3
重试机制的理解是正确的,并且的
LoggingRetry
类中几乎实现了期望的行为。问题出在对
get_backoff_time()
方法的调用中。
在
urllib3
的
Retry
类中,
sleep()
方法(已经正确地对其进行了覆盖)默认情况下使用
self.get_backoff_time()
来计算睡眠时间。此方法引入了指数后退行为。
为了实现
静态
重试时间间隔,需要调整
LoggingRetry
类的
sleep()
方法,使其不使用
get_backoff_time()
计算值。
以下是经过修改的
LoggingRetry
类:
class LoggingRetry(Retry):
def __init__(self, delay_between_retries=0, *args, **kwargs):
print(f"Initializing LoggingRetry with delay_between_retries={delay_between_retries}")
self.delay_between_retries = delay_between_retries
super().__init__(*args, **kwargs)
def sleep(self, response=None):
# 删除以下行以禁用指数后退计算:
# backoff = self.get_backoff_time()
total_sleep_time = self.delay_between_retries
print(f"LoggingRetry sleep - delay_between_retries: {self.delay_between_retries}, Total sleep time: {total_sleep_time}")
time.sleep(total_sleep_time)
通过此更改,
sleep()
方法现在将始终使用在
delay_between_retries
参数中传递的值,从而在每次重试时提供一个静态的 2 秒延迟。
希望这对有所帮助!如果有任何其他问题,请告诉我。
标签:python,urllib3 From: 78809318