Не зарегистрировано исключение при использовании джанго-сельдерея с редисом - PullRequest
6 голосов
/ 12 декабря 2011

Я написал приложение django с именем «task» и добавил его в * INSTALLED_APPS *.
Однако, когда я попытался вызвать его в оболочке django, возникло исключение NotRegistered.Подробная информация ниже:

from task.tasks import add
from celery import registry

# 'task.tasks.add' is registered like below
registry.tasks  # 'task.tasks.add': <@task: task.tasks.add>

# Call add()
r = add.delay(3, 4)
r.successful()  # print "False"

################  celery debug info:    #############################
The full contents of the message body was:
{'retries': 0, 'task': 'task.tasks.add', 'args': (3, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '36d25389-7a0b-4a0a-98f8-d7a17ef9192e'}

Traceback (most recent call last):
  File "/usr/local/lib/python2.6/site-packages/celery/worker/consumer.py", line 427, in receive_message
    eventer=self.event_dispatcher)
  File "/usr/local/lib/python2.6/site-packages/celery/worker/job.py", line 297, in from_message
    on_ack=on_ack, delivery_info=delivery_info, **kw)
  File "/usr/local/lib/python2.6/site-packages/celery/worker/job.py", line 261, in __init__
    self.task = registry.tasks[self.task_name]
  File "/usr/local/lib/python2.6/site-packages/celery/registry.py", line 66, in __getitem__
    raise self.NotRegistered(key)
NotRegistered: 'task.tasks.add'

ОБНОВЛЕНО:
Определение моей задачи:

from celery.task import task
@task
def add(x, y):
    return x + y

Ответы [ 2 ]

5 голосов
/ 12 декабря 2011

Держу пари, что имя, зарегистрированное на работнике, не совпадает с именем на клиенте.

Начните с сельдерея с

celery worker -l info

Чтобы просмотреть список зарегистрированных задач, убедитесь, что в списке нужных задач указано то же имя.

См. Здесь причину, почему это важно, и некоторые распространенные причины: http://docs.celeryproject.org/en/latest/userguide/tasks.html#task-names , и особенно: http://docs.celeryproject.org/en/latest/userguide/tasks.html#automatic-naming-and-relative-imports

Если ваша задача в списке с тем же именем, то у вас может быть старый Работник все еще работает, который не обновлен с последним кодом. Убейте всех бегущих рабочих с помощью

ps auxww | awk ' /celeryd/ {print $2}' | xargs kill -9

(обратите внимание, это прекратит выполнение всех запущенных задач, и вы не сможете вернуть их обратно при использовании транспорта redis)

В будущем вы должны следить за тем, чтобы новые рабочие не запускались поверх старых с помощью аргумента --pidfile для celeryd.

@ линукс-воин: На самом деле, декоратор задач поддерживает оба вызова (с родителями или без), используя немного темной магии:)

4 голосов
/ 13 февраля 2017

У меня была такая же проблема. Это глупо, но в моем случае проблема была в .pyc файлах.

Итак find . -name '*.pyc' -delete и перезапуск работника сельдерея решили мою проблему.

Надеюсь, этот ответ кому-нибудь поможет.

...