有时候celery任务的执行时间过长,如果没有有效控制可能导致mq消息大量堆积。celery 3.1以后的版本提供了超时机制。
超时设置
celery 提供了两个参数来控制task超时时间:
- task_time_limit: 在指定时间内没有完成,task会被kill,然后开始下一个task。
- task_soft_time_limit:
在celery配置文件中使用
1 | time_limit = 30 |
在装饰器中使用
1 |
|
捕获异常
1 | from celery.exceptions import SoftTimeLimitExceeded |
这里实际测试有些情况下仍然捕获不到异常,会直接抛出,出现类似打印:
1 | [2019-01-10 15:42:13,716: ERROR/ForkPoolWorker-11] Pool process <celery.concurrency.asynpool.Worker object at 0x107fddb90> error: SoftTimeLimitExceeded() |
参考文献
[1] http://docs.celeryproject.org/en/latest/userguide/configuration.html#std:setting-task_time_limit