You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Celery Beat启动后卡住,定时任务无法执行求助

Celery Beat启动后定时任务不执行的修复方案

问题根源

  1. 定时任务配置未加载:你定义的CELERYBEAT_SCHEDULE是独立变量,未关联到Celery实例的配置中,Beat无法读取任务调度规则。
  2. 日志级别不匹配:任务中使用logger.debug(),但启动命令指定-l info,导致任务执行日志无法显示。
  3. 任务名称不规范:未使用完整的模块路径作为任务名,Celery可能无法定位任务。

修复代码

修改你的app.py代码如下:

from datetime import timedelta
from celery import Celery
from celery.utils.log import get_task_logger

celery = Celery(
    __name__,
    broker='redis://localhost:6379',
    include=['tasks']  # 若任务移至tasks.py则保留,否则改为['app']或移除
)
celery.conf.timezone = 'UTC'

# 将调度规则注入Celery配置(Celery 4.x+推荐写法)
celery.conf.beat_schedule = {
    'every-second': {
        'task': 'app.periodic_task',  # 使用完整模块路径作为任务名
        'schedule': timedelta(seconds=1),
    }
}

logger = get_task_logger(__name__)

@celery.task
def periodic_task():
    logger.info('yay')  # 调整日志级别至info,匹配启动命令的日志等级

关键说明

  • 配置关联:必须将调度字典赋值给celery.conf.beat_schedule,而非单独定义CELERYBEAT_SCHEDULE(旧版环境变量方式已废弃)。
  • 任务名规范:任务名需为模块名.任务函数名的完整路径,确保Celery能准确定位任务。
  • 日志级别匹配:启动命令用-l info时,任务日志需使用info及以上级别(如logger.info())才能在控制台输出。

重启验证

执行原启动命令:

celery -A app.celery worker -B -l info

正常情况下,你会看到每秒输出类似以下的日志,证明任务正在执行:

[2022-12-24 17:xx:xx,xxx: INFO/MainProcess] Received task: app.periodic_task[xxxxxx]
[2022-12-24 17:xx:xx,xxx: INFO/ForkPoolWorker-1] yay
[2022-12-24 17:xx:xx,xxx: INFO/ForkPoolWorker-1] Task app.periodic_task[xxxxxx] succeeded in 0.001s: None

内容的提问来源于stack exchange,提问作者mr_bulrathi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 07:50:18