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

Celery调度器任务已发送至Worker但未执行问题求助

Django + Celery 定时任务调度成功但未执行问题排查

问题说明

在Django项目中使用Celery实现定期调用外部API并更新数据库的功能,Celery Beat调度器已成功将任务发送至Celery Worker,但任务始终未执行。

相关代码

celery.py(与settings.py同级目录)

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
from django.conf import settings
from celery.schedules import crontab

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "data_analysis.settings")
app = Celery("data_analysis")
app.conf.enable_utc = False
app.conf.update(timezone= 'Asia/Kolkata')
app.config_from_object(settings, namespace="CELERY")
app.autodiscover_tasks()
app.conf.beat_schedule = {
    'update_all_api':{
        'task':'operations.tasks.celery_update',
        'schedule': 30.0,
    }
}


@app.task(bind=True)
def debug_task(self):
    print(f'Request: {self.request!r}')

operations应用内的tasks.py

from celery import shared_task
import time
from operations.models import Machine, MachineData
from operations.analytics.processing import get_data


@shared_task(bind=True)
def celery_update(self):
    print('Running Update')
    print('The time is :' + str(time.asctime(time.localtime(time.time()))))
    print('Getting Data ...')
    all_machines = Machine.objects.all()
    for machine in all_machines:
        data_list = get_data(machine.api_url)
        for data in data_list:
            # print(data)
            if not MachineData.objects.filter(data=data):
                print('New Data received for :' + str(machine))
                MachineData.objects.create(machine=machine, data=data)
            else:
                print('No new data for : ' + str(machine))
    return 'done'

可能的问题及修复方案

  • 任务路径与应用注册问题:确认operations应用已添加到Django的INSTALLED_APPS中,Celery的autodiscover_tasks()依赖此配置自动发现任务。同时检查beat_schedule中的任务名'operations.tasks.celery_update'是否完全匹配任务的实际路径。
  • Worker启动配置错误:启动Worker时必须指定正确的应用实例,执行命令应为:celery -A data_analysis worker -l info。若仅启动Beat未启动Worker,或Worker启动时应用参数错误,会导致任务无法被消费执行。
  • 时区配置不一致:确保Django settings.py中的TIME_ZONE与Celery配置的timezone='Asia/Kolkata'保持一致,避免时间调度出现偏差导致任务未按预期触发。
  • 数据库访问异常:任务中使用Django ORM操作数据库,需确认Worker进程能正常访问数据库。检查settings.py中的数据库配置,若为容器化部署,需确保Worker容器能连接到数据库服务。
  • 任务内部阻塞或静默异常:get_data函数可能存在网络阻塞或抛出未捕获的异常,导致任务看似未执行。可修改任务添加日志记录(替换print为Celery logger),或暂时注释ORM操作,仅保留基础输出,验证任务是否真正触发。
  • 消息中间件连接问题:确认Beat和Worker使用的消息中间件(如Redis、RabbitMQ)配置一致,检查settings.py中的CELERY_BROKER_URL是否正确,Worker能否正常连接到中间件。
  • 版本兼容性问题:检查Celery与Django的版本是否兼容,部分新版本Celery对Django的配置要求有变更,可参考官方文档确认版本匹配关系。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:45:35