使用add_periodic_task()时如何设置Celery Beat定时任务优先级
Celery Beat
add_periodic_task() 设置任务优先级的生效说明 直接给结论:你示例中直接传入priority=3的写法不是必然生效,是否有效取决于你使用的Broker类型、Celery配置、调度器实现三个条件,不会直接报错但不符合条件时会被静默忽略。
具体规则如下:
- 接口透传逻辑:Celery原生的
add_periodic_task()不会拦截priority参数,调度器到点触发任务时,会把这个参数透传给任务发送的apply_async()方法,这是参数生效的基础逻辑。 - 生效前提1:Broker必须支持任务优先级
Celery目前仅在使用RabbitMQ、Redis作为Broker时支持优先级能力,其他Broker不支持该特性,传入priority会被直接忽略。
注意使用Redis作为Broker时,需要提前在Celery配置中开启优先级队列支持,否则参数不生效,参考配置:
你设置的# 配置优先级队列最大优先级,Redis下支持范围为0-9 task_queue_max_priority = 10 # 配置任务默认优先级 task_default_priority = 5priority=3在合法取值范围内,配置正确的情况下可以被识别。 - 生效前提2:使用的调度器会保留priority参数
- 如果使用Celery自带的
PersistentScheduler(本地shelve文件存储调度信息),可以正常保留并透传priority参数,写法有效。 - 如果使用第三方调度器,比如2.2.0版本以前的
django-celery-beat,其数据库存储模型没有内置priority字段,传入的参数会在任务入库时被丢弃,触发任务时不会携带优先级配置,这种写法完全不生效。2.2.0及以后版本的django-celery-beat已经新增了priority字段支持,可以正常传参。
- 如果使用Celery自带的
你可以通过两种方式快速验证是否生效:
- 启动指定消费高优先级队列的Worker,观察该定时任务是否会被正常消费
- 在任务逻辑中打印
self.request.priority,查看任务触发时拿到的优先级值是否为你设置的3
你给出的示例代码如下,可对照上述规则判断适配性:
sender.add_periodic_task( crontab(minute="*/5"), self_monitor_health_checks, priority=3, )
内容的提问来源于stack exchange,提问作者Luke Cousins
相关产品推荐
相关产品推荐

