2013-08-03 86 views
2

我是Celery的新手,我試圖瞭解它是否可以解決我的問題。如何在其他(已啓動)任務完成後運行任務

我需要啓動一些任務(An),然後在完成這些任務後運行另一個任務(B)。問題在於任務An是按順序添加的,我不想在開始第一個之前等待最後一個添加。在任務An完成後,我可以配置任務B執行嗎?

我們在真實的情景:

  • 任務An - 處理由用戶上載的文件(由每個文件 上傳後)
  • 任務B - 做處理所有 的上傳結果的東西文件

替代方案亦歡迎

回答

0

使用RabbitMQ,您可以使用message acknowledgmentaggregator pattern獲得確切的行爲。

您啓動工作,消耗消息(A),並做了一些工作(用戶你的情況上傳文件的過程),但完成時,不會發送ack。相反,它需要下一個消息表單隊列,並且如果它再次執行任務,他正在做同樣的事情。在某個時間點,他將收到任務B,並且可以處理所有以前的A的結果,並將所有結果發送給ack

不幸的是,這種情況下不能與芹菜做,因爲你必須指定創建時間都A任務和最終B任務(鏈,和絃,回調等)。

或者,也可以執行任務B時節省Task.id在單獨的隊列(未芹菜隊列)和處理此信息,每條成功A任務。芹菜可以適合這種算法。

0

爲了確保你能做到這一點,芹菜帆布支持的許多選項,inluding您所需要的行爲,一組任務後運行的任務......它被稱爲「和絃」,如:

from celery import chord 
from tasks import task_upload1, task_upload2, task_upload3, final_execution 

result = chord(task_upload1.s(), task_upload2.s(), task_upload3.s())(final_execution.s()) 
get_required_result = result.get() 

你可以參考this鏈接瞭解更多詳情

+0

這是行不通的。 'An'是一個處理文件的任務,不會上傳它。除了被調用的數據之外,所有'An'任務都是相同的。這些數據還沒有準備好。所以我知道會有100個任務需要等待,但我沒有數據立即啓動所有這些(或定義一個和絃)。我不想在開始之前等待所有數據準備就緒。我希望它更清楚。 – Xyand

+0

根據你的後一個定義你想要什麼,和絃仍然應該工作,task_upload的東西是我對任務的命名,你可以根據需要更改任務的名稱或行爲,你應該定義你的任務somwhere in代碼(傳統上,在tasks.py中,但它可以在任何地方)..關於你沒有任務的參數..我不確定你的意思! – securecurve

+0

但是根據我對你想要的東西的部分理解,你可以讓任務檢查數據庫是否有數據可用性,如果沒有,任務可以在一段時間後重試,並且在移動到下一個任務之前和絃(連鎖)..否則,請讓我知道,如果我可以幫助。 – securecurve

相關問題