Celery 任务失败重试机制

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

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值