我有一个Django应用程序,它使用Celery创建异步任务。其中一些任务存在于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文档,我发现如果客户端和工作人员不使用相同的CELERY_RESULT_BACKEND
设置,任务可能会被困在PENDING中。在这种情况下,我不能在远程工作者上使用django-db
后端,因为它不是Django应用程序。
所以在这种情况下。。。以这种方式进行远程调用时,如何存储结果?
注意,在remote.bar
的情况下,我确认远程工作者接收到消息并执行该方法。只是我的客户端(Django应用程序)没有收到响应。
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或";直接的";远程Celery/Django工作人员的数据库访问?