Учебник Django Celery не возвращает результаты

UDATE3: нашел проблему. См. Ответ ниже.

UPDATE2: Кажется, я столкнулся с проблемой автоматического именования и относительного импорта, запустив учебник djcelery через оболочку manage.py, как показано ниже. Он по-прежнему не работает для меня, но теперь я получаю новые сообщения об ошибках журнала. См. Ниже.

ОБНОВЛЕНИЕ: Я добавил журнал в нижней части сообщения. Кажется, что примерная задача не зарегистрирована?

Оригинальное сообщение:

Я пытаюсь запустить django-celery. Мне не удалось пройти этот пример.

Я установил кроликмк успешно и без проблем прошел через учебники: http://www.rabbitmq.com/getstarted.html

Затем я попытался пройти учебник по djcelery.

Когда я запускаю python manage.py celeryd -l info, я получаю сообщение:   [Задания]    - app.module.add   [2011-07-27 21:17:19, 990: WARNING/MainProcess] начался сельдерей @sequoia.

Так выглядит хорошо. Я помещал это в верхнюю часть моего файла настроек:

import djcelery
djcelery.setup_loader()

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "guest"
BROKER_PASSWORD = "guest"
BROKER_VHOST = "/"

добавили их в мои установленные приложения:

'djcelery',

вот мой файл tasks.py в папке задач моего приложения:

from celery.task import task

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

Я добавил это в свой файл django.wsgi:

os.environ["CELERY_LOADER"] = "django"

Затем я ввел это в командной строке:

>>> from app.module.tasks import add
>>> result = add.delay(4,4)
>>> result
(AsyncResult: 7auathu945gry48- a bunch of stuff)
>>> result.ready()
False

Итак, похоже, что это сработало, но вот проблема:

>>> result.result
>>>               (nothing is returned)
>>> result.get()

Когда я вставляю result.get(), он просто зависает. Что я делаю неправильно?

ОБНОВЛЕНИЕ:. Это то, что работает логгер на переднем плане, когда я запускаю рабочий сервер:

No handlers could be found for logger "multiprocessing"

[Configuration]
- broker:      amqplib://[email protected]:5672/
- loader:      djcelery.loaders.DjangoLoader
- logfile:     [stderr]@INFO
- concurrency: 4
- events:      OFF
- beat:        OFF

[Queues]
- celery:      exchange: celery (direct)  binding: celery

[Tasks]
 - app.module.add
[2011-07-27 21:17:19, 990: WARNING/MainProcess] [email protected] has started.

 C:\Python27\lib\site-packages\django-celery-2.2.4-py2.7.egg\djcelery\loaders.py:80:  UserWarning: Using settings.DEBUG leads to a memory leak, neveruse this setting in production environments!
     warnings.warn("Using settings.DEBUG leads to a memory leak, never"

тогда, когда я поставлю команду:

>>> result = add(4,4)

Это появляется в журнале ошибок:

[2011-07-28 11:00:39, 352: ERROR/MainProcess] Unknown task ignored: Task of kind ‘task.add’ is not registered, please make sure it’s imported. Body->"{‘retries’: 0, ‘task’: ‘tasks.add’, ‘args’: (4,4), ‘expires’: None, ‘ta’: None
    ‘kwargs’: {}, ‘id’: ‘225ec0ad-195e-438b-8905-ce28e7b6ad9’}"
Traceback (most recent call last):
   File "C:\Python27\..\celery\worker\consumer.py",line 368, in receive_message
      Eventer=self.event_dispatcher)
   File "C:\Python27\..\celery\worker\job.py",line 306, in from_message 
       **kw)
   File "C:\Python27\..\celery\worker\job.py",line 275, in __init__
       self.task = tasks[self.task_name]
   File "C:\Python27\...\celery\registry.py", line 59, in __getitem__
       Raise self.NotRegistered(key)
NotRegistered: ‘tasks.add’   

Как мне заставить эту задачу регистрироваться и обрабатываться правильно? спасибо.

ОБНОВЛЕНИЕ 2:

Эта ссылка предположила, что незарегистрированная ошибка может быть вызвана несоответствием имени задачи между клиентом и рабочим - http://celeryproject.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

вышел из оболочки manage.py и ввел оболочку python и ввел следующее:

>>> from app.module.tasks import add
>>> result = add.delay(4,4)
>>> result.ready()
False
>>> result.result
>>>                 (nothing returned)
>>> result.get()
                    (it just hangs there)

поэтому я получаю такое же поведение, но новое сообщение журнала. Из журнала появляется сервер, но он не будет возвращать результат:

[2011-07-28 11:39:21, 706: INFO/MainProcess] Got task from broker: app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3]
[2011-07-28 11:39:21, 706: INFO/MainProcess] Task app.module.tasks.add[7e794740-63c4-42fb-acd5-b9c6fcd545c3] succeed in 0.04600000038147s: 8

Итак, сервер получил задание, и он вычислил правильный ответ, но он не отправит его обратно? почему бы и нет?

Ответ 1

Я нашел решение своей проблемы из другого сообщения stackoverflow: Почему Celery работает в оболочке Python, но не в моих представлениях Django? (проблема импорта)

Мне пришлось добавить эти строки в мой файл настроек:

CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("app.module.tasks", )

то в файле task.py я назвал задачу как таковую:

@task(name="module.tasks.add")

Сервер и клиент должны были быть проинформированы о именах задач. Учебники по сельдериху и джанго-сельдеву опускают эти строки в своих учебниках.

Ответ 2

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

python manage.py celeryd

Что говорят журналы сельдерея, сельдерей получает задание? Если нет, возможно, проблема с брокером (неправильная очередь?)

Дайте нам более подробную информацию, таким образом мы сможем помочь вам