背景
按照celery官方教程编写代码,执行worker时一直报错 cannot import Celery
解决方案
出现这个问题的原因是执行celery时,不要再celery.py目录下启动worker,而是在manage.py目录下启动worker,其中celery_app.py也可以命名为celery.py
我的项目目录是这样的
启动职程(worker)的时候按照下面的命令去执行,需要在项目的根目录下运行(manage.py目录下运行)
接下来是重点,启动worker时,需要用--app参数app所在的位置,也就是我们celery_app.py中定义的
app = Celery('do')
的Celery instances所在的位置
celery -A --app=DeviceOperations.celery_app:app worker --loglevel=info
## windows环境下增加 --pool=solo选项
celery -A --app=DeviceOperations.celery_app:app worker --pool=solo --loglevel=info
其中do是我的celery app的名称。
如果未指定app位置则会报错
Error:
Unable to load celery application.
The module do was not found.
这个地方也是官方文档比较坑的地方
部分关键代码 celery_app.py
# celery_app.py
# -*- coding: utf-8 -*-
from __future__ import absolute_import
import os
from celery import Celery
# 只要是想在自己的脚本中访问Django的数据库等文件就必须配置Django的环境变量
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'DeviceOperations.settings')
# app名字
app = Celery('do')
# 配置celery,这个地方我只是简单配置了一下,配置到setting中会更好
class Config:
BROKER_URL = 'redis://localhost'
CELERY_RESULT_BACKEND = 'redis://localhost'
app.config_from_object(Config)
# 到各个APP里自动发现tasks.py文件
app.autodiscover_tasks()