我有一个使用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
设置,则任务可能会被挂起。在这种情况下,我不能在远程工作程序上使用django-db
后端,因为它不是Django应用程序。
所以在这种情况下...当以这种方式进行远程调用时,如何存储结果?
请注意,在remote.bar
的情况下,我确认远程工作者已收到消息并执行了该方法。只是我的客户端(Django App)没有收到响应。
答案 0 :(得分:0)
n.b。,如果不同的celery工作者正在使用不同的结果后端,则可以动态配置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.
如果您想支持这样的配置,您将需要多个工作人员,因为每个工作人员只能将结果连接并存储到单个后端。
答案 1 :(得分:0)
正如已经回答的其他答案一样,您可以设置result_backend
。我必须用Celery(result_backends=....)
来指定它,因为我在Django设置中设置的SQL地址URL被忽略了。但是,这种方法的问题是您需要提供
直接访问数据库,这使事情变得简单,但如果您的芹菜工人需要位于其他网络中,则不安全。
如果需要考虑安全性,则必须创建API来更新客户端的结果。这是有关这种方法的更多说明。
REST API or "direct" database access for remote Celery/Django workers?