Я близок к тому, что Celery работает с моим проектом Django + Docker-Compose, но у меня есть проблема, когда работник никогда не распознает задание, данное ему. Основная идея заключается в том, что у меня есть функция insertIntoDatabase
, которая вызывается из задачи:Celery + Django - KeyError Незарегистрированная задача
MyApp/tasks.py:
@task(name='tasks.db_ins')
def db_ins_task(datapoints, user, description):
from utils.db.databaseinserter import insertIntoDatabase
insertIntoDatabase(datapoints, user, description)
И в views.py
, я:
from .tasks import db_ins_task
...
db_ins_task.delay(datapoints, user, description)
datapoints
является в основном список словарей и user
и description
- это просто строки. Проблема заключается в том, когда начинается рабочий контейнер сельдерея, это db_ins_task
никогда не встречается в качестве одной из перечисленных задач, поэтому, когда я пытаюсь загрузить все на мой сайт, я получаю следующий вид ошибки:
worker_1 | [2015-09-25 19:38:00,205: ERROR/MainProcess] Received unregistered task of type u'tasks.db_ins'.
worker_1 | The message has been ignored and discarded.
worker_1 |
worker_1 | Did you remember to import the module containing this task?
worker_1 | Or maybe you are using relative imports?
worker_1 | Please see http://bit.ly/gLye1c for more information.
...
worker_1 | Traceback (most recent call last):
worker_1 | File "/usr/local/lib/python2.7/site-packages/celery/worker/consumer.py", line 455, in on_task_received
worker_1 | strategies[name](message, body,
worker_1 | KeyError: u'tasks.db_ins'
I «ве пытается получить рабочий признать задачу, в том числе добавление этого параметра settings.py
:
CELERY_IMPORTS = ('myapp.tasks',)
Я добавил некоторые функции протоколирования отладки для tasks.py
, чтобы убедиться, что он не полностью пропустил, и я могу подтвердить, что каждый раз, когда я пытаюсь запустить эту задачу, журнал регистрации сообщает, что tasks.py
запустить. Для справки, вот worker
контейнер в docker-compose.yml
:
worker:
build: .
links:
- redis
command: bash -c "celery -A myproj worker --app=taskman.celery --loglevel=DEBUG"
celery.py
находится в отдельном приложении под названием taskman
. Что именно я не делаю правильно, что приведет к этой ошибке с задачами?
Попробуйте добавить это в свой конфигурационный файл 'app.autodiscover_tasks (lambda: settings.INSTALLED_APPS)'. Где приложение - ваше приложение для сельдерея. – Gocht
Хм, это уже в моем 'celery.py'. Здесь я получаю сельдерей, чтобы найти его настройки из 'settings.py' проекта Django, и эта часть определенно работает, поскольку контейнер« worker »правильно использует эти настройки. –
Попробуйте вызвать свой модуль следующим образом: app = Celery ('your_project', broker = 'redis: // localhost: 6379/0', backend = 'redis: // localhost: 6379/0', include = [ 'myapp.tasks',]) – Gocht