13

我使用新安装的 celery 和 django 1.4 进行了以下设置:

设置.py:

import djcelery
djcelery.setup_loader()

BROKER_HOST = 'localhost'
BROKER_PORT = 5672
BROKER_USER = 'user'
BROKER_PASSWORD = 'password'
BROKER_VHOST = 'test'

[...]

INSTALLED_APPS = [
    'django.contrib.auth',
    'django.contrib.admin',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'djcelery',
    'south',
    'compressor',
    'testapp',
]

testapp/tasks.py:

from celery.task import task

@task()
def add(x, y):
    return x + y

向 celeryd 的消息传递工作正常,但该任务始终未注册(因此自动发现在这里似乎无法正常工作)。只有当我在tasks/__init__.py任务中找到导入任务模块并且我可以使用它。

此外,关于装饰器导入的文档也有点令人困惑,但我认为这是正确的。

我的设置中的错误在哪里?

4

7 回答 7

33

添加CELERY_IMPORTS到您的 settings.py 中:

CELERY_IMPORTS = ('testapp.tasks',)

导入testapp.tasks.__init__文件中的所有任务

然后Celery将从 testapp.tasks 文件夹中导入所有任务并按原样命名

于 2012-04-19T20:40:40.520 回答
12

这是 django-celery 2.5.4 中的一个错误,请升级到 2.5.5!

于 2012-04-19T22:17:46.830 回答
9

对于在这里偶然发现类似问题解决方案的任何人。

在我的情况下,它是从旧的模块基础INSTALLED_APPS设置切换到新的基于AppConfig的配置。

新应用程序应避免使用 default_app_config。相反,他们应该要求在 INSTALLED_APPS 中明确配置相应 AppConfig 子类的虚线路径

要解决此问题,您应该更改将包裹送入 celery 的方式,如2248 Celery 问题中所述:

from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()]

而不是旧的 Celery 3 方式

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
于 2016-12-06T13:13:30.360 回答
5

我对 django 1.4.1 celery 3.0.9 有同样的问题,并通过命名任务来修复它。

@task() -> @task(name='testapp.tasks.add')

于 2012-08-31T22:31:28.360 回答
3

python就我而言,直到我尝试在 shell(或python manage.py shell)中导入任务之前,我无法弄清楚问题所在。

>>> from project_name.tasks import task_add
于 2019-09-30T20:17:55.833 回答
2

我很确定你必须导入“Celery app instance”并声明一个这样的任务:

from project_name.celery import app

@app.task
def video_process_task(video_id):
    pass

请注意,在 project_dir/project_name 文件夹中有一个 celery.py 文件,它声明了 celery 实例,如下所示:

from __future__ import absolute_import
import os
from celery import Celery
from django.conf import settings

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

按照官方文档中的说明。

此外,您必须通过以下三种方式之一注册任务:

  • Django 项目的 settings.py 文件中的 CELERY_IMPORTS 变量,如 dgel 的回答
  • 传递bind=True给装饰器,如:@app.task(bind=True)
  • 如果你像上面那行一样为 celery 设置自动发现app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) ,每个 Django 应用程序的文件夹都可以包含一个 tasks.py 文件,其中声明的任务将被自动注册

请注意,对任务的更改需要 CELERY RESTART 才能生效

于 2016-02-27T14:59:48.843 回答
0

添加到Umair A. 的答案中,ImportError我的 tasks.py 文件中有一个异常导致 Celery 没有在模块中注册任务。所有其他模块任务均已正确注册。

在我尝试在 Python Shell 中导入 Celery 任务之前,这个错误并不明显。我修复了错误的导入语句,然后成功注册了任务。

于 2020-09-17T01:01:09.753 回答