回调芹菜apply_async

时间:2012-09-21 08:09:48

标签: python celery

我在我的应用程序中使用celery来运行定期任务。我们来看下面的简单示例

from myqueue import Queue
@perodic_task(run_every=timedelta(minutes=1))
def process_queue():
    queue = Queue()
    uid, questions = queue.pop()
    if uid is None:
        return

    job = group(do_stuff(q) for q in questions)
    job.apply_async()

def do_stuff(question):
    try:
        ...
    except:
        ...
        raise

正如您在上面的示例中所看到的,我使用celery来运行异步任务,但是(因为它是一个队列)如果queue.fail(uid)中出现异常,我需要do_stuff或者queue.ack(uid)否则。在这种情况下,在两种情况下都可以从我的任务中获得一些回调 - on_failureon_success

我看到了一些documentation,但从未见过使用apply_async回调的做法。有可能吗?

2 个答案:

答案 0 :(得分:36)

对Task类进行子类化并重载on_success和on_failure函数:

class CallbackTask(Task):
    def on_success(self, retval, task_id, args, kwargs):
        pass

    def on_failure(self, exc, task_id, args, kwargs, einfo):
        pass


@celery.task(base=CallbackTask)  # this does the trick
def add(x, y):
    return x + y

答案 1 :(得分:6)

当您调用apply_async时,可以通过link和link_err kwargs指定成功和错误回调。芹菜文档包含一个明确的例子:http://docs.celeryproject.org/en/latest/userguide/calling.html#linking-callbacks-errbacks