Django-celery项目,如何处理结果后端的结果?

Cla*_*ara 6 django celery

1)我目前正在开发一个公开REST API的Web应用程序,并使用Django和Celery来处理请求并解决它们.对于要求解决的请求,必须向amqp队列提交一组芹菜任务,以便它们在工作者(位于其他机器上)上执行.每项任务都是CPU密集型的,需要很长时间才能完成.

我已经将Celery配置为使用amqp作为结果后端,我使用RabbitMQ作为Celery的经纪人.

每个任务都返回一个结果,该结果需要在DB中存储,但不能直接由工作人员存储.只有"中心节点" - 运行django-celery的机器和RabbitMQ队列中的发布任务 - 才能访问此存储数据库,因此工作人员的结果必须以某种方式返回此计算机.

问题是我如何处理事后执行的结果?因此,在一个worker完成之后,它的结果会存储在配置的结果后端(amqp)中,但现在我不知道从那里获取结果并处理它们的最佳方法是什么.

我在文档中找到的只是您可以不时检查结果的状态:

result.state
Run Code Online (Sandbox Code Playgroud)

这意味着基本上我需要一段专门的代码来定期运行这个命令,因此只用这个来忙着整个线程/进程,或者用以下方法来阻止所有东西:

result.get()
Run Code Online (Sandbox Code Playgroud)

直到任务完成,这不是我想要的.

我能想到的唯一解决方案是在"中心节点"上有一个额外的线程,它定期运行一个函数,该函数基本上检查每个任务在提交时返回的async_results,并在任务完成状态时采取行动.

有没有人有任何其他建议?

此外,由于后端结果的处理发生在"中心节点"上,我的目标是最小化此操作对该机​​器的影响.

最好的方法是什么?

2)人们通常如何解决处理工人返回的结果并放入后端结果的问题?(假设已配置后端结果)

jdc*_*rov 2

我不确定我是否完全理解你的问题,但考虑到每个任务都有一个任务 ID。如果任务是由用户发送的,您可以存储 id,然后使用 json 检查结果,如下所示:

#urls.py 
from djcelery.views import is_task_successful

urlpatterns += patterns('',
    url(r'(?P<task_id>[\w\d\-\.]+)/done/?$', is_task_successful,
        name='celery-is_task_successful'),
    )
Run Code Online (Sandbox Code Playgroud)

其他相关概念是信号,每个完成的任务都会发出一个信号。完成的任务将发出 task_success 信号。更多信息可以在实时过程中找到。