Я полагаю, что лучшее решение здесь, если работник также видит его как "fable.jobs.tasks.Submitter", это имеет больше смысла с точки зрения приложения.

ановил Celery (последняя стабильная версия). У меня есть каталог с именем/home/myuser/fable/jobs, Внутри этого каталога у меня есть файл tasks.py:

from celery.decorators import task
from celery.task import Task

class Submitter(Task):
    def run(self, post, **kwargs):
        return "Yes, it works!!!!!!"

Внутри этой директории у меня также есть файл celeryconfig.py:

BROKER_HOST = "localhost"
BROKER_PORT = 5672
BROKER_USER = "abc"
BROKER_PASSWORD = "xyz"
BROKER_VHOST = "fablemq"

CELERY_RESULT_BACKEND = "amqp"
CELERY_IMPORTS = ("tasks", )

В моем/etc/profileУ меня есть эти PYTHONPATH:

PYTHONPATH=/home/myuser/fable:/home/myuser/fable/jobs

Итак, я запускаю свой рабочий Celery, используя консоль ($ celeryd --loglevel=INFO), и я попробую это. Я открываю консоль Python и импортирую задачи. Затем я запускаю Submitter.

>>> import fable.jobs.tasks as tasks
>>> s = tasks.Submitter()
>>> s.delay("abc")
<AsyncResult: d70d9732-fb07-4cca-82be-d7912124a987>

Все работает, как вы можете видеть в моей консоли

[2011-01-09 17:30:05,766: INFO/MainProcess] Task tasks.Submitter[d70d9732-fb07-4cca-82be-d7912124a987] succeeded in 0.0398268699646s:

Но когда я захожу в мой файл Django views.py и запускаю точно 3 строки кода, как указано выше, я получаю это:

[2011-01-09 17:25:20,298: ERROR/MainProcess] Unknown task ignored: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported.": {'retries': 0, 'task': 'fable.jobs.tasks.Submitter', 'args': ('abc',), 'expires': None, 'eta': None, 'kwargs': {}, 'id': 'eb5c65b4-f352-45c6-96f1-05d3a5329d53'}
Traceback (most recent call last):
  File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/listener.py", line 321, in receive_message
    eventer=self.event_dispatcher)
  File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 299, in from_message
    eta=eta, expires=expires)
  File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/worker/job.py", line 243, in __init__
    self.task = tasks[self.task_name]
  File "/home/myuser/mysite-env/lib/python2.6/site-packages/celery/registry.py", line 63, in __getitem__
    raise self.NotRegistered(str(exc))
NotRegistered: "Task of kind 'fable.jobs.tasks.Submitter' is not registered, please make sure it's imported."

Это странно, потому что клиент celeryd показывает, что он зарегистрирован, когда я его запускаю.

[2011-01-09 17:38:27,446: WARNING/MainProcess]  
Configuration ->
    . broker -> amqp://[email protected]:5672/fablemq
    . queues ->
        . celery -> exchange:celery (direct) binding:celery
    . concurrency -> 1
    . loader -> celery.loaders.default.Loader
    . logfile -> [stderr]@INFO
    . events -> OFF
    . beat -> OFF
    . tasks ->
        . tasks.Decayer
        . tasks.Submitter

Может кто-нибудь помочь?

 Thierry Lam20 мар. 2012 г., 19:37
Вы также используете джанго-сельдерей или просто сельдерей?

Ответы на вопрос(3)

http://celeryq.org/docs/userguide/tasks.html#automatic-naming-and-relative-imports

Имя задачи - «tasks.Submitter» (как указано в выводе celeryd), но вы импортируете задачу как «fable.jobs.tasks.Submitter».

Я полагаю, что лучшее решение здесь, если работник также видит его как "fable.jobs.tasks.Submitter", это имеет больше смысла с точки зрения приложения.

CELERY_IMPORTS = ("fable.jobs.tasks", )
Решение Вопроса

что ваш файл tasks.py должен быть импортирован в приложение django (зарегистрированное в settings.py). В качестве альтернативы, вы можете попробовать импортировать задачи из__init__.py файл в вашем основном проекте или в одном из приложений.

Также попробуйте запустить celeryd из manage.py:

$ python manage.py celeryd -E -B -lDEBUG

(-E а также-B может или не нужно, но это то, что я использую).

 TIMEX10 янв. 2011 г., 05:00
Я думаю, что я решил это. Я положил: sys.path.append ("../ jobs") в мои views.py, и это сработало!
 TIMEX10 янв. 2011 г., 02:48
Что значит "должен быть в приложении Django"? У меня есть файл tasks.py в виде отдельного файла, и я импортирую его в файл views.py (импорт fable.jobs.tasks в качестве задач)
 Seth10 янв. 2011 г., 02:52
Задачи должны быть зарегистрированы, чтобы быть замеченным сельдереем. Это не произойдет автоматически вviews.py файл, так как этот файл не загружается автоматически Python. Я уверен, что Celery будет автоматически находить задачи в файле с именемtasks.py это в приложении Django, или вы можете попробовать импортировать задачи в__init__.py.
 TIMEX10 янв. 2011 г., 04:31
Почему, когда я запускаю оболочку python (где угодно), она может обнаруживать и регистрировать задачи?
 Lionel05 окт. 2011 г., 11:11
Кроме того, мне пришлось запустить celeryd в каталоге, который содержал celeryconfig.py

в Settings.py я добавил

CELERY_IMPORTS = ("myapp.jobs", )

в папке myapp я создал файл с именем jobs.py

from celery.decorators import task

@task(name="jobs.add")
def add(x, y):
    return x * y

Затем запускается из командной строки: python manage.py celeryd -l info

в другой оболочке я запускал оболочку python manage.py, затем

>>> from myapp.jobs import add
>>> result = add.delay(4, 4)
>>> result.result

и я получаю:

16

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

:-)

 ApPeL21 мая 2012 г., 09:28
У меня была та же проблема, и простым добавлением CELERY_IMPORTS в мое приложение это сработало, спасибо.
 sequoia03 авг. 2011 г., 23:52
Спасибо за это решение, это так просто, но оно остановило показ моего проекта. Они должны включать строку CELERY_IMPORTS в учебник.
 mattdeboard16 авг. 2011 г., 17:34
Спасибо за размещение вашего решения. На самом деле мне было явно сказано, что CELERY_IMPORTS не нужен с django-celery, что djcelery.setup_loader () обрабатывает это, автор статьи в #celery. Разочаровал, что мне пришлось без необходимости гоняться за диким гусем.
 citadelgrad01 апр. 2012 г., 23:39
-1 В документации явно сказано не импортировать его как «myapp.jobs». Я знаю, что в этом примере вы указываете имя, но этот пример гораздо более запутанный, чем правильное выполнение.docs.celeryq.org/en/latest/userguide/...

Ваш ответ на вопрос