2014-12-05 54 views
0

我有一個python芹菜redis隊列處理上傳和下載價值的演出和一次數據。芹菜重複運行長時間運行完成的任務一遍又一遍

很少有上傳需要幾個小時。然而,一旦這樣的任務結束,我目睹了這個奇怪的芹菜行爲,芹菜調度員再次將剛剛結束的任務再次發送給工人(我正在運行單個工人),而且它發生了兩次任務!

有人可以幫助我知道爲什麼會發生這種情況,我該如何預防它?

這些任務絕對完成整潔,沒有錯誤報告只是這些是非常長的運行任務。

+0

嘗試使用[flower](http://flower.readthedocs.org/en/latest/)查看芹菜隊列中發生了什麼。 – lunixbochs 2014-12-05 07:52:52

+0

我看到一堆排隊的任務,但就是這樣。有什麼具體的我需要看看? – user2252999 2014-12-05 08:17:28

+0

檢查日程安排 – 2014-12-05 08:37:41

回答

1

我最近就遇到了這個問題,並最終想通了,任務是 運行,因爲 task prefetching和任務相結合的多次超過 visibility timeout。任務在執行之前被確認(除非您設置ACKS_LATE = True), ,默認情況下每個進程預取4個任務。第一個任務將在執行前確認 ,但如果執行需要一個多小時,則其他預取任務將被交付給另一個工作人員,其中 將被執行一個額外的時間(或者在您的情況下,執行額外的時間 時間由同一個工作人員)。

您可以通過提高可見性超時的東西超過你的任務可能的最長運行時間解決:

BROKER_TRANSPORT_OPTIONS = {'visibility_timeout': 3600*10} # 10 hours 

您還可以設置PREFETCH_MULTIPLIER=1禁用預取,這樣長時間運行的任務不保持 其他被承認的任務。