如何对Celery任务实施自动重试 [英] How to implement autoretry for Celery tasks

查看:107
本文介绍了如何对Celery任务实施自动重试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在Celery中,如果发生异常,您可以重试任何任务.您可以这样做:

In Celery, you can retry any task in case of exception. You can do it like so:

@task(max_retries=5)
def div(a, b):
    try:
        return a / b
    except ZeroDivisionError, exc:
        raise div.retry(exc=exc)

在这种情况下,如果要除以零,任务将退役五次.但是您必须明确地检查代码中的错误.如果您跳过 try-except 块,则该任务不会退役.

In this case, if you want to to divide by zero, task will be retied five times. But you have to check for errors in you code explicitly. Task will not be retied if you skip try-except block.

我希望我的功能看起来像这样:

I want my functions to look like:

@celery.task(autoretry_on=ZeroDivisionError, max_retries=5)
def div(a, b):
    return a / b

推荐答案

我搜索了一段时间,但只发现此功能请求.

I searched this issue for a while, but found only this feature request.

我决定编写自己的装饰器以进行自动重试:

I decide to write my own decorator for doing auto-retries:

def task_autoretry(*args_task, **kwargs_task):
    def real_decorator(func):
        @task(*args_task, **kwargs_task)
        @functools.wraps(func)
        def wrapper(*args, **kwargs):
            try:
                func(*args, **kwargs)
            except kwargs_task.get('autoretry_on', Exception), exc:
                wrapper.retry(exc=exc)
        return wrapper
    return real_decorator

有了这个装饰器,我可以重写我以前的任务:

With this decorator I can rewriter my previous task:

@task_autoretry(autoretry_on=ZeroDivisionError, max_retries=5)
def div(a, b):
    return a / b

这篇关于如何对Celery任务实施自动重试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆