2017-07-26 127 views
0

我試圖將現有的芹菜組呼叫轉換成和絃以防止死鎖。以前的代碼有重試和到期時間。我設法讓和絃在沒有這些設置的情況下工作,但是當我嘗試應用設置時,我沒有看到正在運行的任務。我沒有看到有關在整個和絃上應用相同設置的文檔中的任何內容。我正在運行芹菜版本3.1.6。阻止任務在芹菜和絃中運行的任務選項

以前的代碼:

jobs = group([reset_device.s(topoid, dev_list[i], 
       waittime_list[i], skipflag) for i in range(len(dev_list))] 
      ).apply_async(expires=waittime, retry=True, retry_policy={ 
                'max_retries': 3, 
                'interval_start': 0.5, 
                'interval_step': 0.2, 
                'interval_max': 0.2}) 
results = jobs.join_native(timeout=waittime + 600, propagate=True) 

工作弦(無設置):

jobs = chord([reset_device.s(topoid, dev_list[i], 
       waittime_list[i], skipflag) for i in range(len(dev_list))])(callback) 

非工作弦#1:

jobs = chord([reset_device.s(topoid, dev_list[i], waittime_list[i], 
      skipflag).set(expires=datetime.now() + timedelta(seconds=waittime)).set(retry=True).set(retry_policy=retry_policy) 
       for i in range(len(dev_list))])(callback) 

非工作弦#2

jobs = chord([reset_device.subtask(args=(topoid, dev_list[i], waittime_list[i],skipflag), 
       expires=datetime.now()+timedelta(seconds=waittime), retry=True, retry_policy=retry_policy) 
      for i in range(len(dev_list))])(callback) 

在#1和#2情況下,和絃中的任務似乎都不會運行。 如何申請到期時間並重試每個在和絃中調用的任務?

+0

你可以設置花卉以確保這些任務沒有運行? – jheld

+0

如何在'reset_device'任務中執行'retry'?並將任務裝飾器定義爲'@ app.task(max_retries = 3)'和任何你需要的東西。 – ItayB

回答

1

我想通了,這是一個問題的混合。

第一個問題是儘管文檔沒有做任何區分,但expires字段並不接受和絃內的整數,只有datetime對象(可能是組和鏈)。這已被固定在更高版本,我測試了3.1.25,並能夠驗證修復。

第二個問題是芹菜3.1.6不記錄和絃內的錯誤(我認爲組和鏈也是)。這也已經修復,我在3.1.25測試,並能看到失敗。

第三個問題是有關該錯誤消息:

[2017-08-07 18:39:56,043: ERROR/Worker-5] Chord '98246849-0d5d-4be2-85e3-3fc08e90011d' raised: TaskRevokedError(u'expired',) 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/celery/app/builtins.py", line 90, in unlock_chord 
ret = j(timeout=3.0, propagate=propagate) 
    File "/usr/local/lib/python2.7/dist-packages/celery/result.py", line 691, in join_native 
raise value 
TaskRevokedError: expired 

這是因爲時區是不正確的。我曾用datetime.now()而不是datetime.utcnow(),它解決了這個問題,並在3.1.6中工作。

或者我可以設置芹菜配置CELERY_ENABLE_UTC = False,默認設置爲True。這讓我感到困惑,因爲我們已將配置CELERY_TIMEZONE設置爲當地時間。與日期時間對象一起使用時,expires字段使用本地時間或UTC,具體取決於CELERY_ENABLE_UTC設置的值。我建議保持兩個配置設置相同。

有趣的是,回調函數被創建並輪詢以查看和絃是否完成,儘管和絃任務從未執行,並且它只是永遠停留在那裏。我相信這may have been fixed in celery 4.1