Учебник по Django Celery не дает результатов - PullRequest
11 голосов
/ 28 июля 2011

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

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

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

Исходное сообщение:

Я пытаюсь запустить джанго-сельдерей. Я не смог пройти через пример.

Я успешно установил rabbitmq и без проблем прошел уроки: 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] celery @ 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://guest@localhost: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] celery@sequoia 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

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

Ответы [ 2 ]

14 голосов
/ 04 августа 2011

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

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

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

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

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

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

4 голосов
/ 28 июля 2011

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

python manage.py celeryd

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

Дайте нам больше подробностей, и мы поможем вам

...