[英]Heroku with Django, Celery and CloudAMPQ - timeout error
[英]Celery timeout in Django
在 celery 中,在不同時期共運行了 8 個任務。 它們都是事件驅動的任務。 在某個事件之后,他們被解雇了。 並且特定任務會持續工作,直到滿足某些條件。
我已經注冊了一個任務,它檢查某些條件近兩分鍾。 大多數情況下,此任務運行良好。 但有時無法實現任務的預期行為。
任務簽名如下:
任務.py
import time
from celery import shared_task
@shared_task()
def some_celery_task(a, b):
main_time_end = time.time() + 120
while time.time() < main_time_end:
...
# some db operations here with given function arguments 'a' and 'b'
# this part of the task get execute most of the time
if time.time() > main_time_end:
...
# some db operations here.
# this part is the part of the task that doesn't get executed sometimes
視圖.py
# the other part of the view not mentioned here
# only the task invoked part
some_celery_task.apply_async(args=(5, 9), countdown=0)
我對 celery 任務超時場景感到困惑。 這是否意味着任務將從超時處停止或將自動重試? 如果你們對超時和重試有任何明確的想法,這將是一個很大的幫助。
上面解釋的場景背后的原因可能是什么? 對這個問題的任何幫助將不勝感激。 謝謝你。
檢查有關 Tasks 的 Celery 文檔- 基礎知識記錄得很好。
如果任務失敗或被終止 - 任務將具有states.FAILURE
狀態。 除非特別編碼,否則不會重試。 如果日志記錄配置正確 - 在超時或其他代碼異常的情況下,您可能會在日志中看到異常消息。
當超過 Celery 任務TIME_LIMIT 時- 任務立即終止:
處理任務的工人將被殺死並替換為新的。
此外, TimeLimitExceeded
異常將引發類似Task handler raised error: "TimeLimitExceeded(2700)"
消息Task handler raised error: "TimeLimitExceeded(2700)"
如果 Celery SOFT_TIME_LIMIT被設置並且小於TIME_LIMIT
並且被超過 - 將引發SoftTimeLimitExceeded
異常,允許它在任務中被SoftTimeLimitExceeded
並執行清理操作。
當工作人員從代理隊列中消費消息(任務)時 - 代理需要知道消息已成功消費。 確認成功消耗消息工作者向 broker 確認 (ACK) 。 在消息未被確認之前,它不會從代理中刪除,但也不能用於消費(“不可見”)。 未確認 - 消息將重新發送回代理隊列,可再次使用。
重新傳遞未確認的消息邏輯取決於代理:
AMQP (RabbitMQ) 代理 - 跟蹤與 worker 的連接狀態,如果連接丟失 - 將消息返回到隊列。
默認情況下,celery worker 會在任務開始時確認消息。
如果設置了ACKS_LATE - 工作人員僅在成功執行任務后才向代理確認。
可以通過捕獲任務中的異常並將相同的任務發送回代理重新執行來重試任務 - 然后具有相同 id 的相同任務將在代理處排隊。 倒計時選項允許在重試任務之前指定延遲。
Celery 任務執行和其他選項可以在settings.py
全局settings.py
也可以作為每個任務的參數settings.py
。
推薦的方式來設計任務/邏輯,並考慮到這些事件是完全合法的,並看到它們正常(但實際上並不預期)在某個時候發生並做好准備:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.