Callback for celery apply_async

匿名 (未验证) 提交于 2019-12-03 00:59:01

问题:

I use celery in my application to run periodic tasks. Let's see simple example below

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 

As you can see in the example above, i use celery to run async task, but (since it's a queue) i need to do queue.fail(uid) in case of exception in do_stuff or queue.ack(uid) otherwise. In this situation it would be very clear and usefull to have some callback from my task in both cases - on_failure and on_success.

I saw some documentation, but never seen practices of using callbacks with apply_async. Is it possible to do that?

回答1:

Subclass the Task class and overload the on_success and on_failure functions:

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 


回答2:

You can specify success and error callbacks via the link and link_err kwargs when you call apply_async. The celery docs include a clear example: http://docs.celeryproject.org/en/latest/userguide/calling.html#linking-callbacks-errbacks



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!