Celery提供任务失败重试机制。比如一个发送邮件的异步任务,可能遇到超时问题,则应该重试执行。
下面给个例子:
@celery_app.task(bind=True)
def send_email(self):
try:
print('开始执行发送邮件异步任务')
raise IOError # 主动抛出异常,模拟发生错误
except Exception as e:
"""
retry的参数可以有:
exc:指定抛出的异常
throw:重试时是否通知worker是重试任务
eta:指定重试的时间/日期
countdown:在多久之后重试(每多少秒重试一次,默认3分钟)
max_retries:最大重试次数(默认3次)
"""
self.retry(exc=e, countdown=3)
启动worker,触发异步任务,查看celery日志如下:
可以看到一共重试了5次,5次都没有成功,最后抛出异常。
[2021-01-13 14:18:11,441: WARNING/MainProcess] ???[???]: celery@55Y72D0VY2BLTW2 ready.
[2021-01-13 14:18:11,463: DEBUG/MainProcess] basic.qos: prefetch_count->16
[2021-01-13 14:18:19,164: INFO/MainProcess] ???[???]: Received task: send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]
[2021-01-13 14:18:19,166: WARNING/Worker-1] send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]: 开始执行发送邮件异步任务
[2021-01-13 14:18:19,264: INFO/MainProcess] ???[???]: Task send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] retry: Retry in 3s: OSError()
[2021-01-13 14:18:19,326: INFO/MainProcess] ???[???]: Received task: send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] eta:[2021-01-13 14:18:22.177532+08:00]
[2021-01-13 14:18:19,327: DEBUG/MainProcess] basic.qos: prefetch_count->17
[2021-01-13 14:18:22,180: WARNING/Worker-1] send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]: 开始执行发送邮件异步任务
[2021-01-13 14:18:22,306: INFO/MainProcess] ???[???]: Received task: send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] eta:[2021-01-13 14:18:25.217864+08:00]
[2021-01-13 14:18:22,307: INFO/MainProcess] ???[???]: Task send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] retry: Retry in 3s: OSError()
[2021-01-13 14:18:25,220: WARNING/Worker-1] send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]: 开始执行发送邮件异步任务
[2021-01-13 14:18:25,334: INFO/MainProcess] ???[???]: Received task: send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] eta:[2021-01-13 14:18:28.250677+08:00]
[2021-01-13 14:18:25,336: INFO/MainProcess] ???[???]: Task send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] retry: Retry in 3s: OSError()
[2021-01-13 14:18:28,253: WARNING/Worker-1] send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]: 开始执行发送邮件异步任务
[2021-01-13 14:18:28,377: INFO/MainProcess] ???[???]: Received task: send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] eta:[2021-01-13 14:18:31.283711+08:00]
[2021-01-13 14:18:28,378: INFO/MainProcess] ???[???]: Task send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] retry: Retry in 3s: OSError()
[2021-01-13 14:18:31,284: WARNING/Worker-1] send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]: 开始执行发送邮件异步任务
[2021-01-13 14:18:31,287: INFO/MainProcess] ???[???]: Received task: send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] eta:[2021-01-13 14:18:34.285827+08:00]
[2021-01-13 14:18:31,288: INFO/MainProcess] ???[???]: Task send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] retry: Retry in 3s: OSError()
[2021-01-13 14:18:34,288: WARNING/Worker-1] send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b]: 开始执行发送邮件异步任务
[2021-01-13 14:18:34,290: ERROR/MainProcess] ???[???]: Task send_email.tasks.send_email[6d9aa88b-d08b-4b93-8312-36157ac6f08b] raised unexpected: OSError()
Traceback (most recent call last):
File "c:\venv\my_drf\lib\site-packages\celery\app\trace.py", line 240, in trace_task
R = retval = fun(*args, **kwargs)
File "c:\venv\my_drf\lib\site-packages\celery\app\trace.py", line 438, in __protected_call__
return self.run(*args, **kwargs)
File "C:\Users\Administrator\Desktop\my_drf\my_drf_django\celery_tasks\send_email\tasks.py", line 33, in send_email
self.retry(exc=e, countdown=3, max_retries=5)
File "c:\venv\my_drf\lib\site-packages\celery\app\task.py", line 684, in retry
maybe_reraise()
File "c:\venv\my_drf\lib\site-packages\celery\utils\__init__.py", line 248, in maybe_reraise
reraise(exc_info[0], exc_info[1], exc_info[2])
File "c:\venv\my_drf\lib\site-packages\celery\five.py", line 91, in reraise
raise value
File "C:\Users\Administrator\Desktop\my_drf\my_drf_django\celery_tasks\send_email\tasks.py", line 31, in send_email
raise IOError # 主动抛出异常,模拟发生错误
OSError