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
文中有事件監聽的思路
