Сельдерей получил незарегистрированное задание типа (пример запуска) - PullRequest
77 голосов
/ 19 марта 2012

Я пытаюсь запустить пример из документации Celery.

Я бегу: celeryd --loglevel=INFO

/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
  "is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]  

 -------------- celery@ubuntu v2.5.1
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://guest@localhost:5672//
- ** ----------   . loader:      celery.loaders.default.Loader
- ** ----------   . logfile:     [stderr]@INFO
- ** ----------   . concurrency: 4
- ** ----------   . events:      OFF
- *** --- * ---   . beat:        OFF
-- ******* ----
--- ***** ----- [Queues]
 --------------   . celery:      exchange:celery (direct) binding:celery

tasks.py:

# -*- coding: utf-8 -*-
from celery.task import task

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

run_task.py:

# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())

В той же папке celeryconfig.py:

CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300

Когда я запускаю «run_task.py»:

на консоли Python

eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False

ошибки на сервере celeryd

[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.

Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.

The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
    self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'

Пожалуйста, объясните, в чем проблема.

Ответы [ 28 ]

47 голосов
/ 30 марта 2012

Я думаю, вам нужно перезагрузить рабочий сервер.Я сталкиваюсь с той же проблемой и решаю ее путем перезапуска.

46 голосов
/ 02 июля 2012

У меня была та же проблема: причина "Received unregistered task of type.." в том, что служба celeryd не нашла и не зарегистрировала задачи при запуске службы (кстати, их список виден при запуске ./manage.py celeryd --loglevel=info).

Эти задачи должны быть объявлены в CELERY_IMPORTS = ("tasks", ) в файле настроек.
Если у вас есть специальный файл celery_settings.py, он должен быть объявлен при запуске службы celeryd как --settings=celery_settings.py, как писал digivampire.

43 голосов
/ 19 марта 2012

Вы можете просмотреть текущий список зарегистрированных задач в классе celery.registry.TaskRegistry.Возможно, что ваш celeryconfig (в текущем каталоге) не находится в PYTHONPATH, поэтому celery не может его найти и возвращается к значениям по умолчанию.Просто укажите это явно при запуске сельдерея.

celeryd --loglevel=INFO --settings=celeryconfig

Вы также можете установить --loglevel=DEBUG, и вы, вероятно, должны сразу увидеть проблему.

20 голосов
/ 07 марта 2014

Независимо от того, используете ли вы CELERY_IMPORTS или autodiscover_tasks, важным моментом является то, что задачи могут быть найдены, а имена задач, зарегистрированных в Celery, должны совпадать с именами, которые рабочие пытаются извлечь.Когда вы запускаете Celery, скажем celery worker -A project --loglevel=DEBUG, вы должны увидеть название задач.Например, если у меня есть задача debug_task в моем celery.py.

[tasks]
. project.celery.debug_task
. celery.backend_cleanup
. celery.chain
. celery.chord
. celery.chord_unlock
. celery.chunks
. celery.group
. celery.map
. celery.starmap

Если вы не видите свои задачи в списке, пожалуйста, проверьте, правильно ли конфигурирует ваш импорт сельдерея, или--setting, --config, celeryconfig или config_from_object.

Если вы используете ритм сельдерея, убедитесь, что имя задачи, task, которое вы используете в CELERYBEAT_SCHEDULE, совпадает с именем в списке задач сельдерея.

13 голосов
/ 24 августа 2012

У меня тоже была такая же проблема; Я добавил

CELERY_IMPORTS=("mytasks")

в моем celeryconfig.py файле, чтобы решить его.

8 голосов
/ 12 июня 2013

Для меня эта ошибка была решена путем обеспечения того, чтобы приложение, содержащее задачи, было включено в настройку django INSTALLED_APPS.

7 голосов
/ 31 мая 2013

Использование --settings не работает для меня.Мне пришлось использовать следующее, чтобы все это заработало:

celery --config=celeryconfig --loglevel=INFO

Вот файл celeryconfig с добавленным CELERY_IMPORTS:

# Celery configuration file
BROKER_URL = 'amqp://'
CELERY_RESULT_BACKEND = 'amqp://'

CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_TIMEZONE = 'America/Los_Angeles'
CELERY_ENABLE_UTC = True

CELERY_IMPORTS = ("tasks",)

Моя установка была немного сложнеепотому что я использую supervisor для запуска сельдерея в качестве демона.

5 голосов
/ 28 сентября 2018
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

пожалуйста, включите = ['proj.tasks'] Вам нужно перейти в верхний каталог, затем выполнить это

celery -A app.celery_module.celeryapp worker --loglevel=info

, а не

celery -A celeryapp worker --loglevel=info

в вашем входе celeryconfig.py import = ("path.ptah.tasks",)

пожалуйста, в другом модуле вызовите задачу !!!!!!!!

2 голосов
/ 13 декабря 2016

У меня была такая же проблема при запуске заданий из Celery Beat. Сельдерей не любит относительный импорт, поэтому в моем celeryconfig.py мне пришлось явно указать полное имя пакета:

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
2 голосов
/ 24 августа 2016

У меня возникла таинственная проблема, когда я добавил некоторую обработку сигналов в свое приложение django. При этом я преобразовал приложение для использования AppConfig, что означает, что вместо простого чтения как 'bookingINSTALLED_APPS оно читается как 'booking.app.BookingConfig'.

Celery не понимает, что это значит, поэтому я добавил INSTALLED_APPS_WITH_APPCONFIGS = ('booking',) в настройки django и изменил мой celery.py с

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

до

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...