Подтвердить что ты не робот

Сельдерей: автоматическое обнаружение не находит модуль задач в приложении

У меня есть следующая настройка со свежим установленным сельдереем и 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',
]

TestApp/tasks.py:

from celery.task import task

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

Доставка сообщений в celeryd прекрасно работает, но задача всегда незарегистрирована (поэтому автоматическое обнаружение, похоже, не работает корректно здесь). Только если я импортирую модуль задач в tasks/__init__.py, задача будет найдена, и я могу ее использовать.

Кроме того, документация немного запуталась в отношении импорта декоратора, но я думаю, что сейчас это правильно.

Где ошибка в моей настройке?

4b9b3361

Ответ 1

Это была ошибка в django-celery 2.5.4, пожалуйста, обновите до 2.5.5!

Ответ 2

Добавьте CELERY_IMPORTS в свои настройки .py:

CELERY_IMPORTS = ('testapp.tasks',)

Импортировать все задачи в файл testapp.tasks.__init__

Затем Celery импортирует все задачи из папки testapp.tasks и назовет их как они

Ответ 3

Для любого, кто спотыкается здесь, ищет аналогичное решение проблемы.

В моем случае это был переход от старой настройки баз модулей INSTALLED_APPS к новой конфигурации AppConfig.

Новые приложения должны избегать default_app_config. Вместо этого они должны требовать, чтобы пунктирный путь к соответствующему подклассу AppConfig был явно настроен в INSTALLED_APPS.

Чтобы это исправить, вы должны изменить способ подачи посылок на сельдерей, как указано здесь в проблеме с 2248 сельдереем:

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

Вместо старого сельдерея 3 пути:

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

Ответ 4

У меня была та же проблема с django 1.4.1 celery 3.0.9 и исправлена ​​ее, назвав задачу.

@task() → @task (name= 'testapp.tasks.add')

Ответ 5

Я уверен, что вам нужно импортировать экземпляр приложения Celery и объявить задачу следующим образом:

from project_name.celery import app

@app.task
def video_process_task(video_id):
    pass

обратите внимание на наличие файла celery.py в папке project_dir/project_name, которая объявляет экземпляр 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)

как указано в официальной документации .

также необходимо зарегистрировать задачу одним из трех способов:

  • переменная CELERY_IMPORTS в файле настроек проекта Django. как в ответе dgel
  • передать bind=True декоратору, например: @app.task(bind=True)
  • если вы установите автообнаружение для сельдерея, как это сделано выше в строке app.autodiscover_tasks(lambda: settings.INSTALLED_APPS) , каждая папка приложения Django может содержать файл tasks.py, а объявленные в нем задачи будут автоматически зарегистрированы

Обратите внимание, что изменения в задачах REQUIRE A CELERY RESTART вступают в силу

Ответ 6

В моем случае я не мог понять проблему, пока не попытался импортировать задачи в оболочке (python или python manage.py shell).

>>> from project_name.tasks import task_add