1)我目前正在開發一個暴露REST API的Web應用程序,並使用Django和Celery來處理請求並解決它們。爲了獲得解決的請求,必須將一組芹菜任務提交給amqp隊列,以便他們在工人(位於其他機器上)上執行。每個任務都是CPU密集型的,需要很長時間才能完成。Django-celery項目,如何處理結果後端的結果?
我已經配置芹菜也使用amqp作爲結果後端,我使用RabbitMQ作爲芹菜的經紀人。
每個任務都會返回一個結果,事後需要將其存儲在數據庫中,而不是由工作人員直接存儲。只有「中央節點」 - 在RabbitMQ隊列中運行django-celery和發佈任務的機器 - 才能訪問此存儲數據庫,因此工作人員的結果必須以某種方式返回到本機。
問題是我該如何處理之後的任務執行結果?所以在工作完成後,其結果會存儲在配置的結果後端(amqp)中,但現在我不知道從那裏獲取結果並處理它們的最佳方式是什麼。
所有我能找到的文檔中,你可以對結果的檢查狀態,不時有:
result.state
這意味着,基本上我需要一個專門的一段代碼,定期運行該命令,並且因此保持整個線程/進程忙於此,或者用此來阻塞所有內容:
result.get()
直到任務完成,這不是我所希望的。
我能想到的唯一解決方案是在「中央節點」上有一個額外的線程,該線程定期運行一個函數,該函數基本上檢查每個任務在提交時返回的async_results,並在任務完成狀態。
有沒有人有任何其他建議?另外,由於後端結果的處理髮生在「中央節點」上,所以我的目標是儘量減少此操作對本機的影響。
什麼是最好的方法來做到這一點?
2)人們通常會如何解決處理從工人返回的結果並放入後端結果的問題?(假設已經配置了後端結果)
「中央節點」上的芹菜任務消費者。這位消費者的目標是將數據保存在數據庫中。它只在找到jobqueue中的數據時才起作用,因此它不是週期性的。 – Crazyshezy