Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django芹菜项目,如何处理结果后端的结果?_Django_Celery - Fatal编程技术网

Django芹菜项目,如何处理结果后端的结果?

Django芹菜项目,如何处理结果后端的结果?,django,celery,Django,Celery,1) 我目前正在开发一个web应用程序,它公开了一个RESTAPI,并使用Django和芹菜来处理请求和解决它们。为了解决请求,必须向amqp队列提交一组芹菜任务,以便在工人(位于其他机器上)上执行这些任务。每个任务都非常占用CPU,需要很长时间(小时)才能完成 我已经将芹菜配置为也使用amqp作为结果后端,并且使用RabbitMQ作为芹菜的代理 每个任务返回一个结果,该结果需要随后存储在数据库中,但不能由工作人员直接存储。只有“中心节点”(运行django芹菜并在RabbitMQ队列中发布任务

1) 我目前正在开发一个web应用程序,它公开了一个RESTAPI,并使用Django和芹菜来处理请求和解决它们。为了解决请求,必须向amqp队列提交一组芹菜任务,以便在工人(位于其他机器上)上执行这些任务。每个任务都非常占用CPU,需要很长时间(小时)才能完成

我已经将芹菜配置为也使用amqp作为结果后端,并且使用RabbitMQ作为芹菜的代理

每个任务返回一个结果,该结果需要随后存储在数据库中,但不能由工作人员直接存储。只有“中心节点”(运行django芹菜并在RabbitMQ队列中发布任务的机器)可以访问此存储数据库,因此工作者的结果必须以某种方式返回到这台机器上

问题是如何处理任务执行后的结果?因此,工作程序完成后,其结果将存储在配置的结果后端(amqp)中,但现在我不知道从那里获取结果并进行处理的最佳方式是什么

我在文档中所能找到的是,您可以随时通过以下方式检查结果的状态:

result.state
这意味着,基本上我需要一段专门的代码,定期运行此命令,从而使整个线程/进程只忙于此命令,或者使用以下命令阻止一切:

result.get()
直到任务完成,这不是我想要的

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

有人有其他建议吗

此外,由于后端结果的处理在“中心节点”上进行,因此我的目标是将此操作对本机的影响降至最低

最好的方法是什么


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'),
    )
#url.py
从djcelery.views导入任务成功吗
urlpatterns+=模式(“”,
url(r'(?P[\w\d\-\.]+)/done/?$,任务是否成功,
name='celery-is_task_successful'),
)

另一个相关概念是,每个完成的任务都会发出一个信号。finnished任务将发出任务成功信号。有关更多信息,请访问。

中心节点上的芹菜任务使用者。此使用者的目标是将数据保存在数据库中。只有在作业队列中找到数据时,它才起作用,因此它不是周期性的。是的,问题是我需要一个事件使用者,以便捕捉信号或不时检查任务状态……这与提交作业的部分无关,因为我不想通过任务ID的循环来阻止作业提交过程…问题是人们通常怎么做?好的,我想我在你发给我的关于实时进程的链接中找到了我的答案。谢谢