2013-02-06 97 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