Debian 为什么可以';芹菜守护进程看到任务了吗?

Debian 为什么可以';芹菜守护进程看到任务了吗?,debian,django,celery,Debian,Django,Celery,我有一个Django 1.62应用程序在Debian 7.8上运行,Nginx 1.2.1作为我的代理服务器,Gunicorn 19.1.1作为我的应用服务器。我已经安装了芹菜3.1.7和RabbitMQ 2.8.4来处理异步任务。我可以启动芹菜工人作为守护进程,但每当我尝试运行芹菜文档中所示的测试“添加”任务时,我会出现以下错误: Received unregistred task of type u'apps.photos.tasks.add'. The message has been i

我有一个Django 1.62应用程序在Debian 7.8上运行,Nginx 1.2.1作为我的代理服务器,Gunicorn 19.1.1作为我的应用服务器。我已经安装了芹菜3.1.7和RabbitMQ 2.8.4来处理异步任务。我可以启动芹菜工人作为守护进程,但每当我尝试运行芹菜文档中所示的测试“添加”任务时,我会出现以下错误:

Received unregistred task of type u'apps.photos.tasks.add'.
The message has been ignored and discarded.

Traceback (most recent call last):
File "/home/swing/venv/swing/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 455, in on_task_received
strategies[name](message, body,
KeyError: u'apps.photos.tasks.add'
如果我从命令行启动芹菜,我可以在Python解释器控制台中运行“添加”任务,而不会出现问题

我的所有配置文件都保存在一个“conf”目录中,该目录位于我的“myproj”项目目录的正下方。“添加”任务位于apps/photos/tasks.py中

myproj
│
├── apps
    ├── photos
    │   ├── __init__.py
    │   ├── tasks.py
    conf
    ├── celeryconfig.py
    ├── celeryconfig.pyc
    ├── celery.py
    ├── __init__.py
    ├── middleware.py
    ├── settings
    │   ├── base.py
    │   ├── dev.py
    │   ├── __init__.py
    │   ├── prod.py
    ├── urls.py
    ├── wsgi.py
以下是任务文件:

# apps/photos/tasks.py
from __future__ import absolute_import
from conf.celery import app

@app.task
def add(x, y):
    return x + y
以下是我的芹菜应用程序和配置文件:

# conf/celery.py
from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings
from conf import celeryconfig

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'conf.settings')
app = Celery('conf')
app.config_from_object(celeryconfig)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

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

# conf/celeryconfig.py
BROKER_URL = 'amqp://guest@localhost:5672//'
CELERY_RESULT_BACKEND = 'amqp'
CELERY_ACCEPT_CONTENT = ['json', ]
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
这是我的芹菜守护程序配置文件。我注释掉了芹菜应用程序,因为我发现,如果我取消对芹菜守护进程的注释,它甚至不会启动。我还发现需要将“-config”参数添加到CELERYD_OPTS中,以便启动守护进程。我创建了一个可以写入日志和pid文件的非特权“芹菜”用户

# /etc/default/celeryd
CELERYD_NODES="worker1"
CELERYD_LOG_LEVEL="DEBUG"
CELERY_BIN="/home/myproj/venv/myproj/bin/celery"
#CELERY_APP="conf"
CELERYD_CHDIR="/www/myproj/"
CELERYD_OPTS="--time-limit=300 --concurrency=8 --config=celeryconfig"
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"
CELERYD_USER="celery"
CELERYD_GROUP="celery"
CELERY_CREATE_DIRS=1
我可以从日志文件中看到,当我运行命令“sudo-service-celeryd-start”时,芹菜没有任何错误地启动。但是,如果打开pythonshell并运行以下命令,我将看到我在开头描述的错误

$ python shell
In [] from apps.photos.tasks import add
In [] result = add.delay(2, 2)
result.info为空。有趣的是,如果我检查Cellery的registered tasks对象,该任务将列出:

In [] import celery
In [] celery.registry.tasks

Out [] {'celery.chain': ..., 'apps.photos.tasks.add': <@task: apps.photos.tasks.add of conf:0x16454d0> ...}
[]中的
导入芹菜
在[]芹菜.registry.tasks中
Out[]{'celery.chain':…,'apps.photos.tasks.add':…}
这里的其他类似问题已经讨论过使用PYTHONPATH环境变量,而我没有这样的变量。我一直不知道如何设置PYTHONPATH,这个项目在没有它的情况下已经运行了一年多

我还应该补充一点,我的生产设置文件是conf/settings/prod.py。它从base.py导入我的所有基本(独立于层)设置,并添加一些额外的与生产相关的设置

我还注意到,如果在celeryd守护进程文件中使用日志级别的“INFO”,则在Celery日志文件中看不到任何已注册的任务。我想如果你把loglevel设置为INFO,你应该看到所有注册的任务。我通过从命令行运行芹菜命令确认了这一点。当我这样做时,我会在[tasks]块中看到我的任务以及芹菜的任务。但是,当我使用celeryd init脚本启动芹菜时,我根本看不到[tasks]块。我甚至没有看到芹菜的内置任务,例如芹菜.chain或芹菜.chord

谁能告诉我我做错了什么?我已经为这个问题挣扎了两天,我已经没有主意了


谢谢

我花了很多精力来描述这个问题,以及我为解决这个问题所做的努力,以便其他人可以从我的努力中学习。如果你要投票否决我,你至少应该提供一个理由。你解决了这个问题吗?我也吃同样的issues@Mikael我确实设法让它工作了,但我无法解释我是如何做到的。芹菜是非常糟糕的,如果它不开始,它通常不会告诉你为什么。很多时候,这是一个日志或pid文件拥有不正确的权限或所有权的问题。我还从init.d转到了supervisor,以使其正常工作。我还发现,我需要在supervisor.conf中通过其“environment”指令声明所有环境变量。我希望这有点帮助。祝你好运@Mikael,如果你想把你的电子邮件放到你的个人资料里,我很乐意给你发一份supervisor.conf、celeryapp.py和celeryconfig.py文件的副本。他们可能会帮助你。谢谢你,罗伯特!我自己设法使它运转起来。我的守护程序配置文件中有一个错误+存在一些权限问题。现在一切都好了:)