2013-02-06 52 views
6

1)我目前正在开发一个暴露REST API的Web应用程序,并使用Django和Celery来处理请求并解决它们。为了获得解决的请求,必须将一组芹菜任务提交给amqp队列,以便他们在工人(位于其他机器上)上执行。每个任务都是CPU密集型的,需要很长时间才能完成。Django-celery项目,如何处理结果后端的结果?

我已经配置芹菜也使用amqp作为结果后端,我使用RabbitMQ作为芹菜的经纪人。

每个任务都会返回一个结果,事后需要将其存储在数据库中,而不是由工作人员直接存储。只有“中央节点” - 在RabbitMQ队列中运行django-celery和发布任务的机器 - 才能访问此存储数据库,因此工作人员的结果必须以某种方式返回到本机。

问题是我该如何处理之后的任务执行结果?所以在工作完成后,其结果会存储在配置的结果后端(amqp)中,但现在我不知道从那里获取结果并处理它们的最佳方式是什么。

所有我能找到的文档中,你可以对结果的检查状态,不时有:

result.state 

这意味着,基本上我需要一个专门的一段代码,定期运行该命令,并且因此保持整个线程/进程忙于此,或者用此来阻塞所有内容:

result.get() 

直到任务完成,这不是我所希望的。

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

有没有人有任何其他建议?另外,由于后端结果的处理发生在“中央节点”上,所以我的目标是尽量减少此操作对本机的影响。

什么是最好的方法来做到这一点?

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

+0

“中央节点”上的芹菜任务消费者。这位消费者的目标是将数据保存在数据库中。它只在找到jobqueue中的数据时才起作用,因此它不是周期性的。 – Crazyshezy

回答

1

我不确定我是否完全理解您的问题,但考虑到每个任务都有一个任务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'), 
    ) 

其他相关的概念是signals每完成任务发出信号。完成任务将发出task_success信号。更多可以在real time proc找到。

+0

是的,问题是我需要一个事件消费者,以便捕获信号或不时检查任务的状态......并且这与提交工作的部分无关,因为我不会不想通过循环任务ID阻止作业提交过程...问题是人们通常如何做到这一点? – Clara

+0

好吧,我想我在你发给我的关于实时过程的链接中找到了我的答案。谢谢! – Clara