Задать вопрос
@nurzhannogerbek

Как правильно зарегистрировать задачу в Celery 4?

Здравствуйте! Столкнулся с проблемой, что Celery не видит таски из приложения profile. При попытки запустить Celery вылетает ошибка (см. ниже). В списке зарегистрированных тастов нет таска который мне нужен (в моем случаи amount_counting). При этом если поставить в celery.py файл django.setup() таск появляется в списке зарегистрированных и саму задачу можно запустить, но вот в таком случаи уже команды runserver выдает ошибку. Мог бы кто-нибудь посоветовать что делать?

Структура:
TestProject
   TestProject
      - settings.py
      - __init__.py
      - celery.py
  profile
      - tasks.py


celery.py:
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'TestProject.settings')
app = Celery('TestProject')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()


settings.py:
CELERY_BROKER_URL = 'redis://localhost:6379'
CELERY_RESULT_BACKEND = 'redis://localhost:6379'
CELERY_ACCEPT_CONTENT = ['application/json']
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TASK_SERIALIZER = 'json'
CELERY_TIMEZONE = 'Asia/Almaty'
CELERY_BEAT_SCHEDULE = {
    "amount-counting": {
        "task": "profile.tasks.amount_counting",
        "schedule": 60.0,
    },
}


__init__.py:
from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
 
__all__ = ['celery_app']


profile/tasks.py:
from __future__ import absolute_import, unicode_literals
from celery import task
 
 
@task
def amount_counting():
    # Some Code


ERROR:
[2018-06-04 04:29:22,641: INFO/Beat] Scheduler: Sending due task amount-counting (profile.tasks.amount_counting)
[2018-06-04 04:29:22,654: ERROR/MainProcess] Received unregistered task of type 'profile.tasks.amount_counting'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you're using relative imports?

Please see
http://docs.celeryq.org/en/latest/internals/protocol.html
for more information.

The full contents of the message body was:
b'[[], {}, {"callbacks": null, "errbacks": null, "chain": null, "chord": null}]' (77b)
Traceback (most recent call last):
  File "/Users/nurzhan_nogerbek/Virtualenvs/enjoy_jumping/lib/python3.6/site-packages/celery/worker/consumer/consumer.py", line 557, in on_task_received
    strategy = strategies[type_]
KeyError: 'profile.tasks.amount_counting'
  • Вопрос задан
  • 4465 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@nurzhannogerbek Автор вопроса
Нашел проблему и надо сказать для меня это было неожиданно.

В файле tasks.py все зависимости я указал в начали файла как обычно. Так только зависимости поставил в тело функции amount_counting проблема исчезла. Был бы рад, если кто-нибудь объяснил почему все так.

tasks.py:
from __future__ import absolute_import, unicode_literals
from celery import task
 
 
@task
def amount_counting():
    from  app_name.models import ModelName
    # Some other code
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ulkoart
@ulkoart
жмак - нормальный пример
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы