celery timeout的攔截


0X01 場景

celery任務超時報錯,想查看是傳入哪一類數據運行時導致的超時(哪一個插件),但是該報錯難以攔截。

[2019-06-30 17:23:21,070: ERROR/MainProcess] Task tasks.sum[8c81398b-4378-401d-a674-a3bd3418ccde] raised unexpected: TimeLimitExceeded(5.0,)
Traceback (most recent call last):
  File "/home/apernin/.virtualenvs/dr/local/lib/python2.7/site-packages/billiard/pool.py", line 645, in on_hard_timeout
    raise TimeLimitExceeded(job._timeout)
TimeLimitExceeded: TimeLimitExceeded(5.0,)

該超時報錯屬於celery worker(MainProcess)調用時超時的報錯,無法在任務中攔截。

0X02 方法

使用 soft_time_limit參數。

time_limit參數超時直接kill掉;

soft_time_limit參數超時時會報錯而不會kill,可以捕獲。

@app.task(name='tasks.main', bind=True, soft_time_limit=2, errback=error_fun)
def task_main(self, param):
    try:
        time.sleep(10)
    except SoftTimeLimitExceeded as e:
        print e
但是存在問題,windows下似乎無法使用soft_time_limit參數

把uuid以及相關信息在任務運行時都打印出來。

報錯時會顯示uuid。

短暫地攔截日志,再通過uuid關聯,獲取超時任務的信息。

bind將任務也綁定進來,可以通過self獲取任務的相關信息。

@app.task(name='tasks.main', bind=True)
def task_main(self, param):
    print str(self.request.id) + param

https://stackoverflow.com/questions/56819470/retrieving-celery-task-kwargs-from-task-failed-uuid?r=SearchResults

文中有事件監聽的思路


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM