我有一个 Django 1.11 项目,使用 Celery 3.1.25,布局如下:
env
myproject
myapp
myotherapp
settings
settings.py
__init__.py
celery_init.py
我的__init__.py
包含:
from .celery_init import app as celery_app
我的celery_init.py
包含:
from __future__ import absolute_import
import os
import sys
import traceback
from celery import Celery
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.settings')
from django.conf import settings
app = Celery('myproject')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
当我去启动当地的芹菜工人进行开发测试时,有:
env/bin/celery worker -A myproject -l info -n sr@%h -Q somequeue
它失败,但出现异常:
ImportError: No module named myapp
这是什么原因造成的?我认为这是一些路径问题,无法正确加载我的项目设置,但我没有看到我的配置有问题。我刚刚升级到 Django 1.11,这些设置在以前的版本中运行良好。我做错了什么?
我尝试在celery_init.py
末尾添加 print 语句,以确保它加载所有内容,并且每一行都完成而不会出错。
是一个sys.path问题,再加上缺乏初始化Django。工作celery_init.py
如下所示:
from __future__ import absolute_import
import os
import sys
from celery import Celery
import django
app = Celery('myproject')
app.config_from_object('django.conf:settings', namespace='CELERY')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings.settings')
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../myproject')))
django.setup()
from django.conf import settings
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
我遇到了同样的问题。我解决了将 --workdir 参数放在 manage.py 所在的目录中的问题。我现在正在使用芹菜 4.4.0
我正在遵循一个教程(我是芹菜的新手),其中运行"任务"应用程序的命令是:
celery -A worker some_app -l info
但这对我不起作用;只有这样有效(颠倒some_app和工人的顺序)
celery -A some_app worker -l info
似乎第二个代码更有意义,但我不确定为什么第一个代码适用于教程中的那个人而不是我......除非这在旧版本中有效,而不是在我拥有的版本中。