2015-09-25 3 views
2

Я близок к тому, что 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. Что именно я не делаю правильно, что приведет к этой ошибке с задачами?

+0

Попробуйте добавить это в свой конфигурационный файл 'app.autodiscover_tasks (lambda: settings.INSTALLED_APPS)'. Где приложение - ваше приложение для сельдерея. – Gocht

+0

Хм, это уже в моем 'celery.py'. Здесь я получаю сельдерей, чтобы найти его настройки из 'settings.py' проекта Django, и эта часть определенно работает, поскольку контейнер« worker »правильно использует эти настройки. –

+0

Попробуйте вызвать свой модуль следующим образом: app = Celery ('your_project', broker = 'redis: // localhost: 6379/0', backend = 'redis: // localhost: 6379/0', include = [ 'myapp.tasks',]) – Gocht

ответ

3

В вас вопрос вы показать начать свой рабочий с:

celery -A myproj worker --app=taskman.celery --loglevel=DEBUG 

Теперь проблема в том, что -A и --app означают то же самое. Таким образом, это говорит мне о том, что вы waffling между использованием myproj или taskman.celery в качестве владельца вашего приложения Celery. Ваш рабочий использует taskman.celery, потому что из тестирования я обнаружил, что если какая-либо комбинация -A или --app предоставляется одному вызову рабочего, используется только последний.

Это, как говорится, есть один из способов представить вашу проблему. Если ваш файл myapp/tasks.py получает task декоратор от myproj.celery.app, а не taskman.celery.app, вы должны регистрировать свои задачи с помощью неправильного приложения.

+0

Это мне очень помогло, спасибо. Для более подробной информации, что сработало для меня, было изменение команды на «celery worker --app = myapp.tasks --llusvel = DEBUG». Я также избавился от «имени» от декоратора. Также была ошибка относительно слишком большого количества аргументов, передаваемых заданию, но удаление фломастера, казалось, делало трюк (я на самом деле не использовал цветок в любой момент). –

Смежные вопросы