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
相关产品推荐
相关产品推荐

