我有一个使用Celery创建异步任务的Django应用程序。其中一些任务存在于Django项目中,而其他任务存在于具有自己的代码库的远程工作者身上。
我目前使用django-celery-results
包来存储Django数据库中的任务调用结果,这样我就可以使用Django ORM轻松查询调用的状态。当我调用“本地”任务时,这很好用,但是当我调用远程任务时它看起来效果不好。
例如:
app.send_task("django.foo") # Return status SUCCESS and store result in DB
app.send_task("remote.bar") # Stuck in PENDING and never create result in DB
通过阅读Celery Docs,我发现如果客户端和工作人员不使用相同的CELERY_RESULT_BACKEND
设置,任务可能会陷入PENDING状态。在这种情况下,我不能在我的远程工作者上使用django-db
后端,因为它不是Django应用程序。
所以在这种情况下......如何以这种方式进行远程调用时存储我的结果?
请注意,在remote.bar
的情况下,我确认远程工作者收到消息并执行该方法。它只是我的客户端(Django App)没有收到响应。
n.b.,如果不同的芹菜工人使用不同的结果后端,您可以动态配置app
实例。
from celery.app import Celery
app = Celery(broker_url='my_broker_url', result_backend='non-django-orm backend')
result = app.send_task('remote.bar')
# you can check status here just fine.
如果要支持这样的配置,则需要多个工作人员,因为每个工作人员只能连接并将结果存储到单个后端。
正如另一个答案已经说明的那样,你可以设置result_backend
。我不得不用Celery(result_backends=....)
指定它,因为我在Django设置中设置的SQL地址URL被忽略了。但是,这种方法的问题在于,您需要提供对数据库的直接访问,这使得事情变得简单,但如果您的芹菜工作者需要在不同的网络中则不安全。
如果担心安全性,则必须创建API以更新客户端的结果。以下是对这种方法的更多解释。
REST API or "direct" database access for remote Celery/Django workers?