Celery在远程任务上使用Django Result Backend

问题描述 投票:2回答:2

我有一个使用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)没有收到响应。

python django rabbitmq celery
2个回答
0
投票

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.

如果要支持这样的配置,则需要多个工作人员,因为每个工作人员只能连接并将结果存储到单个后端。


0
投票

正如另一个答案已经说明的那样,你可以设置result_backend。我不得不用Celery(result_backends=....)指定它,因为我在Django设置中设置的SQL地址URL被忽略了。但是,这种方法的问题在于,您需要提供对数据库的直接访问,这使得事情变得简单,但如果您的芹菜工作者需要在不同的网络中则不安全。

如果担心安全性,则必须创建API以更新客户端的结果。以下是对这种方法的更多解释。

REST API or "direct" database access for remote Celery/Django workers?

© www.soinside.com 2019 - 2024. All rights reserved.