2013-01-11 75 views
4

我正在使用芹菜3.0.12。Python芹菜任務沒有後端完成

我有兩個隊列:Q1,Q2。

總的來說,我把第一季度的主要任務放在了第二季度的子任務上。 我不想存儲子任務的任何結果。所以我的子任務有裝飾器@ celery.task(ignore_results = True)。

我的主要任務現在應該等到子任務完成。因爲我寫不出結果。我不能使用:AsyncResult。有沒有一種方法可以在主任務中等待,直到子任務完成而不將狀態存儲到後端。我所有使用AsyncResults的嘗試都不成功(它依賴於後端)。它似乎也得到()依賴於後端。

整個故事代碼:

@celery.task(ignore_result=True) 
def subtask(): 
    #Do something 

@celery.task 
def maintask(): 
    # Do something 

    # Call subtask on Q2: 
    res = subtask(options={'queue':'Q2'}).delay() 

    # Need to wait till subtask finishes 
    # NOT WORKING (DOES NEVER RETURN) 
    res.get() 

我監控與芹菜花了整個應用程序,我可以看到,子任務successfuelly整理。芹菜如何檢測到這種狀態?我瀏覽了他們的代碼,但無法找到他們如何進行檢測。

回答

3

我的主要任務應該等到子任務完成。

你永遠不應該等待一個子任務,因爲這可能會導致資源匱乏和死鎖(所有 任務等待另一個任務,但沒有更多的工人來處理它們)。

相反,您應該在子任務完成 之後使用回調來執行其他操作(請參閱Celery用戶指南中的Canvas指南)。

我用芹菜花監控整個應用程序,我可以看到子任務是 成功完成。 Celery如何檢測該狀態?我瀏覽他們的代碼,但不能 瞭解他們如何做檢測。

花和其他顯示器不使用的結果(任務狀態),而不是他們使用我們所說事件

當工作人員發生某些操作時,會發出事件消息,這會變成消息的瞬時流。進程可以訂閱某些事件(或所有這些事件)來監視集羣。

的事件是從任務狀態分開,因爲

  • 活動不持久(瞬態)

    失蹤事件不被視爲一個嚴重故障。

  • 複雜的領域是不會被序列

    活動是用於診斷和參考,而不應被用來 內省任務的返回值或例外 例如,因爲只有這些了repr()存儲,以確保顯示器 可以用其他語言編寫,而大字段可能會被截斷以確保傳輸速度更快。

+0

謝謝,是正確的提示。 – foobar