Я близок к тому, чтобы заставить Celery работать с моим проектом Django + Docker-Compose, но у меня есть проблема, когда рабочий никогда не распознает поставленную перед ним задачу. Основная идея в том, что у меня есть функция insertIntoDatabase
, которая вызывается из задачи:
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
— просто строки. Проблема в том, что при запуске рабочего контейнера Celery эта 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'
Я пытался заставить работника распознать задачу, включая добавление этого параметра в 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)
. Где приложение — это ваше приложение Celery. - person Gocht   schedule 25.09.2015celery.py
. Именно здесь я получаю сельдерей, чтобы найти его настройки изsettings.py
моего проекта Django, и эта часть определенно работает, поскольку контейнерworker
правильно использует эти настройки. - person Dan K   schedule 25.09.2015settings.py
? Вcelery.py
у меня естьapp.config_from_object('django.conf:settings')
, который уже устанавливает такие вещи, как брокер, серверная часть и включение. Такжеlocalhost
не будет работать, поскольку брокер/бэкенд Redis представляет собой контейнер с другим IP-адресом. - person Dan K   schedule 25.09.2015settings.py
. Я знаю, что это работает, потому что журналы для celery worker показывают правильный IP-адрес контейнера Redis для брокера и серверной части. Проблема должна быть в другом. Может быть, у вас есть другие идеи? - person Dan K   schedule 25.09.2015