celery中的 task_time_limit 和 task_soft_time_limit

本周,项目里突然爆出几个任务失败的告警,失败任务也没进死信,就这么丢了,经过排查,发现了这两个配置项的坑。

两个配置项都是默认无时间限制, 单位:秒

区别

task_time_limit:
hard模式,如果配置了10s, 10s内 task 没有执行结束,则处理这个task会被杀掉,并继续执行其他新的 task

task_soft_time_limit:
soft 模式,如果配置了10s, 10s内 task 没有执行结束,可以在 task 内捕获这个异常,并处理。也可以在全局处理,进行重试或扔死信队列等操作。
比如,在 task 中捕获异常:

from celery.exceptions import SoftTimeLimitExceeded

@app.task
def mytask():
    try:
        return do_work()
    except SoftTimeLimitExceeded:
        cleanup_in_a_hurry()

哪里可以配置?

  • 针对 FLASK 或Django框架,可以直接在config中设置
    参考:https://docs.celeryproject.org/en/stable/userguide/configuration.html#task-settings
celery4.X版本
CELERYD_TASK_SOFT_TIME_LIMIT 或 CELERYD_TASK_TIME_LIMIT
task_soft_time_limit 或 task_time_limit

celery5.X版本
CELERYD_SOFT_TIME_LIMIT 或 CELERYD_TIME_LIMIT
task_soft_time_limit 或 task_time_limit
  • 在任务上添加装饰器,例如
@app.task(soft_time_limit=5)
def mytask():
	pass
  • 在celery队列启动命令上添加 --soft-time-limit=20, 比如启动命令为
celery -A app worker -l info --soft-time-limit=10

配置的优先级

三者如果都配置了,那优先级为:
装饰器 > config配置 > 队列启动命令

附:官网解释 https://docs.celeryproject.org/en/stable/userguide/configuration.html#std:setting-task_time_limit
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值