Celery Beat启动后卡住,定时任务无法执行求助
Celery Beat启动后定时任务不执行的修复方案
问题根源
- 定时任务配置未加载:你定义的
CELERYBEAT_SCHEDULE是独立变量,未关联到Celery实例的配置中,Beat无法读取任务调度规则。 - 日志级别不匹配:任务中使用
logger.debug(),但启动命令指定-l info,导致任务执行日志无法显示。 - 任务名称不规范:未使用完整的模块路径作为任务名,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
相关产品推荐
相关产品推荐

