2016-07-05 69 views
0

我是芹菜任務的單元測試。 我有鏈式任務也有組,所以會產生和絃。Python芹菜 - 如何等待所有子任務的和絃

測試應該是這樣的:

  • 運行芹菜任務(延遲)
  • 等待任務和全部任務
  • 斷言

我試過如下:

def wait_for_result(result): 
    result.get() 
    for child in result.children or list(): 
     if isinstance(child, GroupResult): 
      # tried looping over task result in group 
      # until tasks are ready, but without success 
      pass 
     wait_for_result(child) 

這創建了一個de adlock,chord_unlock被永久重試。 我對任務結果不感興趣。 如何等待所有子任務完成?

回答

0

儘管這是一個老問題,我只是想分享我如何擺脫僵局問題的,只是在情況下,它可以幫助別人。

就像芹菜原木說的,從來沒有在任務內使用get()。這確實會造成僵局。

我有一套類似的芹菜任務,其中包括組任務鏈,因此使它成爲一個和絃。我使用龍捲風,通過發出HTTP請求來調用這些任務。所以我所做的就是這樣的:

@task 
def someFunction(): 
    .... 


@task 
def someTask(): 
    .... 


@task 
def celeryTask(): 
    groupTask = group([someFunction.s(i) for i in range(10)]) 

    job = (groupTask| someTask.s()) 

    return job 

celeryTask()正在被龍捲風調用時,鏈將開始執行,&的someTask()的UUID將在job舉行。它看起來像

AsyncResult:765b29a8-7873-4b28-B05C-7e19c33e950c

返回此UUID和celeryTask()退出前連鏈開始執行(理想情況下),因此留下空間另一個進程運行。

然後我使用龍捲風層來檢查任務的狀態。關於龍捲風層的細節可以在這裏找到stackoverflow question