python - 如何重试 x 次并打印长时间睡眠
问题描述
我一直在试图了解退避是如何工作的。我的目标是每当我达到 status_code 等:405 5 次。我想休眠 60000 秒并打印出出现状态错误 405。
现在我已经写了:
import time
import backoff
import requests
@backoff.on_exception(
backoff.expo,
requests.exceptions.RequestException,
max_tries=5,
giveup=lambda e: e.response is not None and e.response.status_code == 405
)
def publish(url):
r = requests.post(url, timeout=10)
r.raise_for_status()
publish("https://www.google.se/")
现在发生的情况是,如果它只达到 405 一次,它将引发 status_code 并停止脚本。我正在寻找的是如何让脚本重试 5 次,如果状态是 405 连续 5 次,那么我们想要长时间睡眠并打印出来。如何使用 backofF 做到这一点?我也提出其他建议:)
旧的计数器方式:
import requests
import time
from requests.exceptions import ConnectionError, ReadTimeout, RequestException, Timeout
exception_counter = 0
while True:
try:
response = requests.get("https://stackoverflow.com/", timeout=12)
if response.ok:
print("Very nice")
time.sleep(60)
else:
print(
f'[Response -> {response.status_code}]'
f'[Response Url -> {response.url}]'
)
time.sleep(60)
if response.status_code == 403:
if exception_counter >= 10:
print("Hit limitation of counter: Response [403]")
time.sleep(4294968)
exception_counter += 1
except (ConnectionError) as err:
print(err)
time.sleep(random.randint(1, 3))
if exception_counter >= 10:
print(f"Hit limitation of coonnectionerror {err}")
time.sleep(4294968)
continue
exception_counter += 1
continue
except (ReadTimeout, Timeout) as err:
print(err)
time.sleep(random.randint(1, 3))
continue
except RequestException as err:
print(err)
time.sleep(random.randint(1, 3))
continue
except Exception as err:
print(err)
time.sleep(random.randint(1, 3))
if exception_counter >= 10:
print(f"Hit limitation of Exception {err}")
time.sleep(4294968)
continue
exception_counter += 1
continue
解决方案
您没有说在睡眠 60000 秒后要做什么,所以我将其设置为在四次尝试后睡眠,然后在正确失败之前进行最后一次(第五次)尝试。
您可以按照on_backoff
处理程序的要求添加自定义逻辑。
我还重新调整了您的giveup
功能,您可能以错误的方式使用了布尔值。
import time
import backoff
import requests
def backoff_hdlr(details):
print("backoff_hdlr", details)
if details["tries"] >= 4:
print(f"sleeping")
time.sleep(1) # 60000
@backoff.on_exception(
backoff.expo,
requests.exceptions.RequestException,
max_tries=5,
giveup=lambda e: e.response.status_code != 405,
on_backoff=backoff_hdlr,
)
def publish(url):
print(f"called publish with url={url}")
r = requests.post(url, timeout=10)
r.raise_for_status()
publish("https://www.google.se/")
/Users/michael/.conda/envs/mip_typing/bin/python /Users/michael/git/mip_typing/scratch_2.py
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 1, 'elapsed': 1.5e-05, 'wait': 0.8697943681459608}
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 2, 'elapsed': 1.144912, 'wait': 1.5425500028676453}
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 3, 'elapsed': 2.949183, 'wait': 0.2052666718206697}
called publish with url=https://www.google.se/
backoff_hdlr {'target': <function publish at 0x7fe45c626b80>, 'args': ('https://www.google.se/',), 'kwargs': {}, 'tries': 4, 'elapsed': 3.418447, 'wait': 5.113712077372433}
sleeping
called publish with url=https://www.google.se/
Traceback (most recent call last):
...
推荐阅读
- flutter - 为什么提供程序包不更改背景图像?
- slack-api - 使用 Slack views.update 端点更新模式的问题
- c# - NHibernate:过滤一对多连接的结果
- wordpress - 我需要用 jQuery 更改 wordpress 文本,但我没有 ID 或 Classes
- python - 如何设置图例中的项目并使用数据框条形图进行绘图
- ios - 用户再次单击按钮时如何推迟隐藏视图?
- r - ggplot2并排和按比例填充
- python - 如果发现错误,继续执行 sql 语句 python sqlite3
- r - 如何添加与日期对应的数字列
- php - 如何在 CodeIgniter 3 中转换此查询