通過代碼:是否有可能通過累積計劃任務來使工人死鎖?
@celery.task()
def some_recursive_task():
# Do some stuff and schedule it to run again later
# Note that the next run is not scheduled in a fixed basis, like crontabs
# but based on history of some object
# Actual task is found here:
# https://github.com/rafaelsierra/cheddar/blob/master/src/feeds/tasks.py#L39
# Then it call himself again
countdown = bla.get_countdown()
some_recursive_task.apply_async(countdown=countdown)
此任務將運行withing接下來的10分鐘和12小時,但這個任務還呼籲應立即運行另一個任務,one for downloading的東西和其他to parse it。
問題是主數據庫中的每條記錄都會調用主函數,假設有幾百個任務正在運行,但考慮到這些任務平均每隔幾個小時運行一次,任務數量並不是什麼大問題。
當我嘗試用單個工作人員運行這個問題時,當我啓動工作人員時,我將其放入運行所有隊列並設置8個併發工作人員,然後開始確認任務,但似乎出現問題即不管將來有多少工作要做,工人都會得到它並等待其計劃運行,這意味着此工人在此之前一直處於鎖定狀態。
我知道我可以將其他兩個函數分成不同的隊列,我已經這樣做了,但是我擔心工人會承認任務要提前12小時運行,並且不會在30分鐘內運行。
工作人員不應該忽視計劃的任務,直到它的時間,並運行那些只是延遲沒有時間?
我不認爲,或者不知道如何,periodic tasks是一個解決方案。
我改變了我的任務的工作流程,併爲他們創建了特定的隊列,從那時起運行正常。我知道eta ==倒計時,我只是使用倒計時,因爲它在上下文中更有意義。 –