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

Celery启动worker时无法自动发现项目根目录下定义的任务

问题原因

Celery默认调用app.autodiscover_tasks()时,只会遍历Django配置中INSTALLED_APPS注册的所有应用,自动加载每个应用目录下的tasks.py模块。你放在项目根目录(与celery.py同级)的tasks.py不属于任何已注册的Django应用,因此不会被自动扫描加载。

解决方案

两种方案任选其一即可:

方案1:手动导入根目录tasks模块(最简便)

直接在myproject/celery.py中,Celery实例初始化完成后手动导入根目录的tasks模块,修改后的配置如下:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
app.autodiscover_tasks()

# 新增以下行,手动导入根目录下的任务
from . import tasks

修改完成后重启Celery worker,就能在已注册任务列表中看到根目录定义的myproject.tasks.add任务。

方案2:配置自动扫描额外任务模块

如果后续还有多个存放在非app目录下的任务模块,可以通过给autodiscover_tasks传参的方式,指定需要扫描的包路径:

import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
app = Celery('myproject')
# 传入需要扫描任务的包列表,默认related_name为"tasks",会自动查找对应包下的tasks.py
app.autodiscover_tasks(packages=['myproject', 'app'])

另外你的app/tasks.py代码存在一个小问题:send_email_task中调用了time.sleep(1)但没有导入time模块,任务执行时会抛出NameError,记得在文件头部补上import time语句。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:27:18