我是Celery的新手,我試圖瞭解它是否可以解決我的問題。如何在其他(已啓動)任務完成後運行任務
我需要啓動一些任務(An
),然後在完成這些任務後運行另一個任務(B
)。問題在於任務An
是按順序添加的,我不想在開始第一個之前等待最後一個添加。在任務An
完成後,我可以配置任務B
執行嗎?
我們在真實的情景:
- 任務
An
- 處理由用戶上載的文件(由每個文件 上傳後) - 任務
B
- 做處理所有 的上傳結果的東西文件
替代方案亦歡迎
我是Celery的新手,我試圖瞭解它是否可以解決我的問題。如何在其他(已啓動)任務完成後運行任務
我需要啓動一些任務(An
),然後在完成這些任務後運行另一個任務(B
)。問題在於任務An
是按順序添加的,我不想在開始第一個之前等待最後一個添加。在任務An
完成後,我可以配置任務B
執行嗎?
我們在真實的情景:
An
- 處理由用戶上載的文件(由每個文件 上傳後)B
- 做處理所有 的上傳結果的東西文件替代方案亦歡迎
使用RabbitMQ,您可以使用message acknowledgment和aggregator pattern獲得確切的行爲。
您啓動工作,消耗消息(A
),並做了一些工作(用戶你的情況上傳文件的過程),但完成時,不會發送ack
。相反,它需要下一個消息表單隊列,並且如果它再次執行任務,他正在做同樣的事情。在某個時間點,他將收到任務B
,並且可以處理所有以前的A
的結果,並將所有結果發送給ack
。
不幸的是,這種情況下不能與芹菜做,因爲你必須指定創建時間都A
任務和最終B
任務(鏈,和絃,回調等)。
或者,也可以執行任務B
時節省Task.id
在單獨的隊列(未芹菜隊列)和處理此信息,每條成功A
任務。芹菜可以適合這種算法。
爲了確保你能做到這一點,芹菜帆布支持的許多選項,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鏈接瞭解更多詳情
這是行不通的。 'An'是一個處理文件的任務,不會上傳它。除了被調用的數據之外,所有'An'任務都是相同的。這些數據還沒有準備好。所以我知道會有100個任務需要等待,但我沒有數據立即啓動所有這些(或定義一個和絃)。我不想在開始之前等待所有數據準備就緒。我希望它更清楚。 – Xyand
根據你的後一個定義你想要什麼,和絃仍然應該工作,task_upload的東西是我對任務的命名,你可以根據需要更改任務的名稱或行爲,你應該定義你的任務somwhere in代碼(傳統上,在tasks.py中,但它可以在任何地方)..關於你沒有任務的參數..我不確定你的意思! – securecurve
但是根據我對你想要的東西的部分理解,你可以讓任務檢查數據庫是否有數據可用性,如果沒有,任務可以在一段時間後重試,並且在移動到下一個任務之前和絃(連鎖)..否則,請讓我知道,如果我可以幫助。 – securecurve