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
Итак, сервер получил задание, и он вычислил правильный ответ, но он не отправит его обратно? почему бы и нет?