Python 芹菜在远程任务上使用Django结果后端

Python 芹菜在远程任务上使用Django结果后端,python,django,rabbitmq,celery,Python,Django,Rabbitmq,Celery,我有一个Django应用程序,它使用芹菜创建异步任务。其中一些任务位于Django项目中,另一些任务位于具有自己代码库的远程工作者上 我目前使用django芹菜结果包将任务调用的结果存储在django数据库中,以便使用django ORM轻松查询调用的状态。当我调用我的“本地”任务时,它工作得很好,但当我调用远程任务时,它似乎工作得不好 例如: app.send_task("django.foo") # Return status SUCCESS and store result in DB

我有一个Django应用程序,它使用芹菜创建异步任务。其中一些任务位于Django项目中,另一些任务位于具有自己代码库的远程工作者上

我目前使用
django芹菜结果
包将任务调用的结果存储在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\u RESULT\u后端设置,任务可能会被挂起。在这种情况下,我不能在我的远程工作者上使用
django db
后端,因为它不是django应用程序

所以在这种情况下。。。以这种方式进行远程调用时,如何存储结果


请注意,在使用
remote.bar
的情况下,我确认远程工作者收到消息并执行该方法。只是我的客户端(Django应用程序)没有收到响应。

n.b.,如果不同的芹菜工作者使用不同的结果后端,您可以动态配置
应用程序
实例

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.

如果您想支持这样的配置,您将需要多个worker,因为每个worker只能将结果连接并存储到单个后端。

正如另一个答案所述,您可以设置
结果\u后端。我不得不用芹菜(result\u backends=..)指定它,因为我在Django设置中设置的SQL地址URL被忽略了。然而,这种方法的问题是,您需要提供
直接访问数据库,这使事情变得简单,但如果你的芹菜工人需要在不同的网络中,就不安全了

如果安全性是一个问题,则必须创建API来更新来自客户端的结果。下面是关于这种方法的更多解释


使用Django Background Task而不是芹菜,因为它很容易,请看我的答案:所以您不想使用数据库作为结果后端。你有很多其他的选择,你可以使用redis:我曾经使用Pika库定制过amqp工作人员的实现。在这些情况下,我发送消息,在客户端等待响应,然后将其存储在客户端的某个结果后端。这不是芹菜结果后端也是如何工作的吗?我是否应该能够检索amqp响应,然后将其存储在Django DB中,以便在任务完成或失败时使用信号和其他工具创建回调?芹菜不是这样工作的。芹菜的工作方式是芹菜工人使用通过代理发送的任务,然后将任务执行的结果存储到结果后端。关心任何特定任务的结果或结果的客户端轮询结果后端,以查看其任务是否准备就绪。原因是芹菜用于分布式多处理,因此芹菜假定在任务完成时客户端不可用,并且需要存储结果。