Celery:自动发现在app中找不到任务模块

Mar*_*tin 12 python django celery django-celery

我有一个新安装的芹菜和django 1.4的以下设置:

settings.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',
]
Run Code Online (Sandbox Code Playgroud)

testapp/tasks.py:

from celery.task import task

@task()
def add(x, y):
    return x + y
Run Code Online (Sandbox Code Playgroud)

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

此外,文档对装饰器导入有点混乱,但我认为现在这是正确的.

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

dge*_*gel 30

添加CELERY_IMPORTS到您的settings.py:

CELERY_IMPORTS = ('testapp.tasks',)
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我对此进行了测试,但没有帮助。只有应用程序的`__init__.py` 中的导入使任务正常工作。 (2认同)

ask*_*sol 11

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


Jan*_*zny 6

对于任何一个在这里绊倒寻找类似问题解决方案的人.

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

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

要解决此问题,您应该更改将包装送到芹菜的方式,如2248 Celery问题中所述:

from django.apps import apps
app.autodiscover_tasks(lambda: [n.name for n in apps.get_app_configs()]
Run Code Online (Sandbox Code Playgroud)

而不是旧的芹菜3方式:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您使用的是 Celery 4,则该错误已修复-- https://github.com/celery/celery/issues/3341-- 您可以执行 `app.autodiscover_tasks()` (2认同)

jan*_*n05 5

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

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