如何捕获Celery中的事件

时间:2012-03-16 17:03:08

标签: python celery django-celery

我刚开始使用芹菜(更具体地说是django-celery),我还不熟悉它。

我正在开发一个应用程序,它将发送要在工作人员中远程执行的任务,每个任务大约需要3分钟才能完成。 (不是繁重的处理,网络抓取的东西,但这是无关紧要的。)

当我发送任务时,我得到一个可用于获取结果的引用。

>>> result = task_name.delay()
>>> result
<AsyncResult: c34d78d8-b512-4165-9384-2b87933e33b7>

但是,要知道任务何时完成,我必须继续进行投票

>>> result.ready()
False

我的想法是避免投票,就是听一个task-succeeded/task-failed事件。 所以,当我知道他们已经返回时,我可以继续处理,而无需检查数据库或不断询问它是否准备就绪。 (如果有人对任务完成检查有更好的建议,我很乐意听到)

不确定我是否在看到明显的问题时遇到了一些问题,但是,我不明白我该怎么办呢。

Celery Events docs中,它说我应该使用自定义相机。 这是另一个问题,因为我打算使用django-celery的Django Admin Monitor。

所以,最后: 我可以在没有相机的情况下拍摄活动吗?怎么样? 如果没有,我可以将它与django-celery的相机一起使用吗?

2 个答案:

答案 0 :(得分:3)

on_successTask和其他处理程序的问题是,它在工作程序上运行。如果使用此方法,则添加到该方法的代码必须触发所需的操作;但是这个任务没有关于什么进程调用它的信息,所以你可能会运行另一个任务......以某种方式路由到调用者...会在队列中等待执行...听起来不像你在寻找什么。

要获取任务级事件的异步通知,请使用http://docs.celeryproject.org/en/latest/userguide/monitoring.html?highlight=my_monitor#id20中演示的Celery.events.State。您可以选择要监视的事件,并在事件发生时获得实时通知(回调样式)。

答案 1 :(得分:0)

现在芹菜文档暂时没有为我解决,但似乎你应该能够设置一个远程任务可以调用的回调方法来通知你任务已经完成。如果/我什么时候可以解决芹菜文档,我会更新这个答案。

编辑:立即获取文档。

因此,根据the documentation,您想要的是具有on_successafter_return处理程序的任务类。根据您的使用情况,此方法可以使用任务的返回值执行您需要执行的处理,也可以通知您结果已成功。除非你特别需要在处理程序而不是worker上运行,否则我会推荐前者。无论如何,您不应再需要轮询result.ready()