作为一个整体,我对芹菜有点陌生,在for循环中遇到了重试情况的问题:
我有以下任务:
@app.task(bind=True, autoretry_for=(CustomException,), retry_kwargs={'max_retries': 10,'countdown': 30})
def call_to_apis(self):
api_list = [api1, api2, api3, api4, api5,...]
for api in api_list:
try:
response = requests.get(api)
if response.status_code == 500:
raise CustomException
except CustomException:
continue
据我所知,芹菜将在我的CustomException
上重试。
在重试的情况下,它是只对失败的api进行重试,还是只重新运行api_list中每个api的整个过程?如果是这样的话,它是否只会重试失败的api?
预期结果:只重试失败的api
编辑:
我把它分成了两个不同的任务和一个请求功能,如下所示:
@app.on_after_configure.connect
def setup_periodic_tasks(sender, **kwargs):
sender.add_periodic_task(300.0, call_to_apis.s())
print("setup_periodic_tasks")
def call_api(api):
response = requests.get(api)
if response.status_code == 500:
raise CustomException
elif response.status_code == 404:
raise CustomWrongLinkException
@app.task(default_retry_delay=30, max_retries=10)
def send_fail_api(api):
try:
call_api(api)
except NonceTooLowException:
try:
send_fail_api.retry()
except MaxRetriesExceededError:
print("reached max retry number")
pass
except Exception:
pass
@app.task()
def call_to_apis():
api_list = [api1, api2, api3, api4, api5,...]
for api in api_list:
try:
call_api(api)
except CustomException:
send_fail_api.delay(api)
except CustomWrongLinkException:
print("wrong link")
except Exception:
pass
它工作了,其他api也完成了,失败的api应该调用另一个任务,每次重试10次,每次延迟30秒。
但我得到了超过预期的重试次数约24次(预计只重试10次(,它还在第10次重试时打印出reached max retry number
,但它仍然重试,直到24次重试
我做错了什么?
如果出现已知异常(在autoretry_for
装饰器参数中指定(,将重试整个任务,请参阅文档。Celery无论如何都不知道引发异常时任务的状态,这是您必须处理的。我建议将任务拆分为单独的任务(每个API一个(,并分别调用它们,大概创建一些工作流。