我刚开始使用芹菜(更具体地说是django-Celery),但我仍然不熟悉它。
我正在开发一个应用程序,它将发送要在工人中远程执行的任务,每个任务大约需要3分钟才能完成。(不是繁重的处理、网络爬行之类的东西,但这无关紧要)。
当我发送任务时,我会得到一个可用于获取结果的引用。
>>> result = task_name.delay()
>>> result
<AsyncResult: c34d78d8-b512-4165-9384-2b87933e33b7>
但是,为了知道任务何时完成,我必须继续轮询
>>> result.ready()
False
为了避免轮询,我的想法是侦听任务成功/任务失败事件。因此,当我知道他们已经返回时,我可以继续处理,而无需检查数据库或不断询问它是否准备好。(如果有人对任务完成检查有更好的建议,我很乐意听到)
不确定我是否在看到显而易见的东西时遇到了问题,但是,我不明白我该怎么做。
在Celery Events文档中,它说我应该为此使用自定义相机。这是另一个问题,因为我打算使用django-celey的django管理监视器。
所以,最后:我可以在没有相机的情况下拍摄事件吗?怎样如果没有,我可以把它和django芹菜的相机一起使用吗?
on_success
和Task
中的其他处理程序的问题是,它在工作线程上运行。如果使用这种方法,则添加到该方法中的代码必须触发所需的操作;但该任务没有关于进程名称的信息,因此您可能会运行另一个任务。。。以某种方式路由到呼叫者。。。将在队列中等待执行。。。听起来不像你想要的。
要获得任务级别事件的异步通知,请使用Celery.events.State
,如中所示http://docs.celeryproject.org/en/latest/userguide/monitoring.html?highlight=my_monitor#id20.您可以选择要监视的事件,并在事件发生时获得实时通知(回调样式)。
现在芹菜文档还没有为我解决,但您似乎应该能够设置一个回调方法,远程任务可以调用该方法来通知您任务已经完成。如果/当我能得到要解决的芹菜文档时,我会更新这个答案。
编辑:现在进入文档。
因此,根据文档,您想要的似乎是一个具有on_success
或after_return
处理程序的任务类。根据您的用例,此方法可以使用任务的返回值执行您需要执行的处理,也可以通知您结果已成功。我建议使用前者,除非您有特定的需要在处理程序而不是工作程序上运行。无论如何,不管怎样,您都不需要再轮询result.ready()
。