Сельдерей получил незарегистрированную задачу типа (пример выполнения)
Я пытаюсь запустить пример из сельдерея документации.
Я бегу: celeryd --loglevel=INFO
/usr/local/lib/python2.7/dist-packages/celery/loaders/default.py:64: NotConfigured: No 'celeryconfig' module found! Please make sure it exists and is available to Python.
"is available to Python." % (configname, )))
[2012-03-19 04:26:34,899: WARNING/MainProcess]
-------------- celery@ubuntu v2.5.1
---- **** -----
--- * *** * -- [Configuration]
-- * - **** --- . broker: amqp://guest@localhost:5672//
- ** ---------- . loader: celery.loaders.default.Loader
- ** ---------- . logfile: [stderr]@INFO
- ** ---------- . concurrency: 4
- ** ---------- . events: OFF
- *** --- * --- . beat: OFF
-- ******* ----
--- ***** ----- [Queues]
-------------- . celery: exchange:celery (direct) binding:celery
tasks.py:
# -*- coding: utf-8 -*-
from celery.task import task
@task
def add(x, y):
return x + y
run_task.py:
# -*- coding: utf-8 -*-
from tasks import add
result = add.delay(4, 4)
print (result)
print (result.ready())
print (result.get())
в той же папке celeryconfig.py:
CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300
когда я бегу "run_task.py":
на консоли python
eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False
ошибки на сервере celeryd
[2012-03-19 04:34:14,913: ERROR/MainProcess] Received unregistered task of type 'tasks.add'.
The message has been ignored and discarded.
Did you remember to import the module containing this task?
Or maybe you are using relative imports?
Please see http://bit.ly/gLye1c for more information.
The full contents of the message body was:
{'retries': 0, 'task': 'tasks.add', 'utc': False, 'args': (4, 4), 'expires': None, 'eta': None, 'kwargs': {}, 'id': '841bc21f-8124-436b-92f1-e3b62cafdfe7'}
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/celery/worker/consumer.py", line 444, in receive_message
self.strategies[name](message, body, message.ack_log_error)
KeyError: 'tasks.add'
Пожалуйста, объясните, в чем проблема.
23 ответа:
вы можете увидеть текущий список зарегистрированных задач, в
celery.registry.TaskRegistry
класса. Может быть, что ваш celeryconfig (в текущем каталоге) не находится вPYTHONPATH
поэтому сельдерей не может найти его и возвращается к значениям по умолчанию. Просто укажите его явно при запуске сельдерея.celeryd --loglevel=INFO --settings=celeryconfig
вы также можете установить
--loglevel=DEBUG
и вы, вероятно, должны немедленно увидеть проблему.
у меня была такая же проблема: Причина
"Received unregistered task of type.."
было ли то, что служба celeryd не нашла и не зарегистрировала задачи при запуске службы (кстати, их список виден при запуске./manage.py celeryd --loglevel=info
).эти задачи должны быть объявлены в
CELERY_IMPORTS = ("tasks", )
в файле настроек.
Если у вас есть специальныйcelery_settings.py
файл должен быть объявлен на celeryd service start как--settings=celery_settings.py
как писал digivampire.
Я думаю, что вам нужно перезапустить рабочий сервер. Я встречаю ту же проблему и решаю ее путем перезапуска.
если вы используете
CELERY_IMPORTS
илиautodiscover_tasks
, важным моментом является то, что задачи могут быть найдены, и имя задач, зарегистрированных в сельдерее, должно совпадать с именами, которые пытаются получить рабочие.когда вы запускаете сельдерей, скажите
celery worker -A project --loglevel=DEBUG
, вы должны увидеть название задачи. Например, если у меня естьdebug_task
задача в моемcelery.py
.[tasks] . project.celery.debug_task . celery.backend_cleanup . celery.chain . celery.chord . celery.chord_unlock . celery.chunks . celery.group . celery.map . celery.starmap
если вы не можете видеть свои задачи в списке, пожалуйста, проверьте правильность импорта конфигурации сельдерея задачи, либо в
--setting
,--config
,celeryconfig
илиconfig_from_object
.если вы используете сельдерей бить, убедитесь, что имя задачи
task
, вы используете вCELERYBEAT_SCHEDULE
соответствует имени в списке задач сельдерей.
у меня тоже была такая же проблема, я добавил
CELERY_IMPORTS=("mytasks")
в своем
celeryconfig.py
файл для его решения.
для меня эта ошибка была решена, обеспечив приложение, содержащее задачи, было включено в настройку INSTALLED_APPS django.
использование --settings не работает для меня. Мне пришлось использовать следующее, чтобы заставить все это работать:
celery --config=celeryconfig --loglevel=INFO
вот файл celeryconfig, в который добавлен CELERY_IMPORTS:
# Celery configuration file BROKER_URL = 'amqp://' CELERY_RESULT_BACKEND = 'amqp://' CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'America/Los_Angeles' CELERY_ENABLE_UTC = True CELERY_IMPORTS = ("tasks",)
моя настройка была немного сложнее, потому что я использую supervisor для запуска сельдерея в качестве демона.
у меня была эта проблема таинственно всплывают, когда я добавил некоторые обработки сигналов в мое приложение django. При этом я преобразовал приложение для использования AppConfig, что означает, что вместо простого чтения как
'booking
' inINSTALLED_APPS
, это читать'booking.app.BookingConfig'
.сельдерей не понимает, что это значит, поэтому я добавил
INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)
в Мои настройки django, и изменил мойcelery.py
Сapp.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
до
app.autodiscover_tasks( lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS )
у меня была такая же проблема с запуском задач из Celery Beat. Сельдерей не любит относительный импорт так в моем
celeryconfig.py
, Я должен был явно установить полное имя пакета:app.conf.beat_schedule = { 'add-every-30-seconds': { 'task': 'full.path.to.add', 'schedule': 30.0, 'args': (16, 16) }, }
у меня не было никаких проблем с Джанго. Но столкнулся с этим, когда я использовал колбы. Решение было установка параметра конфигурации.
celery worker -A app.celery --loglevel=DEBUG --config=settings
в то время как с Джанго, я просто имел:
python manage.py celery worker -c 2 --loglevel=info
app = Celery('proj', broker='amqp://', backend='amqp://', include=['proj.tasks'])
пожалуйста, включите=['proj.задачи'] Вам нужно перейти в верхний реж, а затем exec this
celery -A app.celery_module.celeryapp worker --loglevel=info
не
celery -A celeryapp worker --loglevel=info
в вашем celeryconfig.py импорт входных данных = ("путь.ПТА.задачи",)
пожалуйста, в другом модуле вызовите задачу!!!!!!!!
Если вы столкнулись с такой ошибкой, существует ряд возможных причин, но решение, которое я нашел, состояло в том, что мой конфигурационный файл celeryd в /etc/defaults/celeryd был настроен для стандартного использования, а не для моего конкретного проекта django. Как только я преобразовал его в формат, указанный в элементе сельдерей docs, все было хорошо.
решение для меня, чтобы добавить эту строку в /etc / default / celeryd
CELERYD_OPTS="-A tasks"
потому что когда я запускаю эти команды:
celery worker --loglevel=INFO celery worker -A tasks --loglevel=INFO
только последняя команда показывала имена задач вообще.
Я также попытался добавить CELERY_APP line/etc/default / celeryd, но это тоже не сработало.
CELERY_APP="tasks"
Я тоже столкнулся с этой проблемой, но это не совсем то же самое, так что просто FYI. Последние обновления вызывает это сообщение об ошибке из-за этого синтаксис декоратора.
ERROR / MainProcess] получено незарегистрированное задание типа 'my_server_check'.
@task ('my_server_check')
пришлось изменить на просто
@task ()
Не знаю почему.
У меня была проблема с классами PeriodicTask в django-celery, в то время как их имена отлично отображались при запуске celery worker каждое выполнение срабатывало:
KeyError: у'my_app.задачи.запустить'
моей задачей был класс с именем 'CleanUp', а не просто метод под названием 'run'.
когда я проверил таблицу "djcelery_periodictask", я увидел устаревшие записи и удалил их, исправив проблему.
просто добавить мои два цента для моего случая с этой ошибкой...
мой путь
/vagrant/devops/test
сapp.py
и__init__.py
в нем.когда я запускаю
cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info
Я получаю эту ошибку.но когда я запускаю его как
cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info
все ОК.
Я обнаружил, что один из наших программистов добавил следующую строку в одной из импорта:
os.chdir(<path_to_a_local_folder>)
Это заставило работника сельдерея изменить свой рабочий каталог из рабочего каталога проектов по умолчанию (где он мог найти задачи) в другой каталог (где он не мог найти задачи).
после удаления этой строки кода, все задачи были найдены и зарегистрированы.
сельдерей не поддерживает относительный импорт, поэтому в моем celeryconfig.py вам нужен абсолютный импорт.
CELERYBEAT_SCHEDULE = { 'add_num': { 'task': 'app.tasks.add_num.add_nums', 'schedule': timedelta(seconds=10), 'args': (1, 2) } }
дополнительный пункт к действительно полезному списку.
Я нашел сельдерей неумолимым в отношении ошибок в задачах (или, по крайней мере, я не смог проследить соответствующие записи в журнале), и он не регистрирует их. У меня был ряд проблем с запуском сельдерея Как службы, которые были в основном связаны с разрешениями.
последнее, связанное с записью разрешений в файл журнала. У меня не было проблем в разработке или запуске сельдерея в командной строке, но служба сообщила о задаче как о незарегистрированной.
Мне нужно было изменить разрешения папки журнала, чтобы служба могла писать в нее.
мои 2 цента
я получал это в изображении докера, используя alpine. Настройки django ссылаются
/dev/log
для входа в syslog. Приложение django и работник сельдерея были основаны на одном и том же изображении. Точка входа в изображение приложения django запускаласьsyslogd
на старте, но один для работника, сельдерея не было. Это было причиной таких вещей, как./manage.py shell
потерпеть неудачу, потому что не будет никаких/dev/log
. Работник сельдерея не подвел. Вместо этого он молча игнорируешь остальная часть запуска приложения, которая включала загрузкуshared_task
записи из приложений в проекте django
в моем случае ошибка была вызвана тем, что один контейнер создал файлы в папке, которая была смонтирована на хост-файловой системе с помощью docker-compose.
Мне просто нужно было удалить файлы, созданные контейнером на хост-системе, и я смог снова запустить свой проект.
sudo rm-Rf foldername
(Мне пришлось использовать sudo, потому что файлы принадлежали пользователю root)
настройки версия: 18.03.1
если вы используете
autodiscover_tasks
убедитесь, что вашfunctions
быть зарегистрированным пребывание вtasks.py
, а не любой другой файл. Или сельдерей не может найтиfunctions
вы хотите зарегистрировать.использовать
app.register_task
также будет делать эту работу, но кажется немного наивным.пожалуйста, обратитесь к официальной спецификации
autodiscover_tasks
.def autodiscover_tasks(self, packages=None, related_name='tasks', force=False): """Auto-discover task modules. Searches a list of packages for a "tasks.py" module (or use related_name argument). If the name is empty, this will be delegated to fix-ups (e.g., Django). For example if you have a directory layout like this: .. code-block:: text foo/__init__.py tasks.py models.py bar/__init__.py tasks.py models.py baz/__init__.py models.py Then calling ``app.autodiscover_tasks(['foo', bar', 'baz'])`` will result in the modules ``foo.tasks`` and ``bar.tasks`` being imported. Arguments: packages (List[str]): List of packages to search. This argument may also be a callable, in which case the value returned is used (for lazy evaluation). related_name (str): The name of the module to find. Defaults to "tasks": meaning "look for 'module.tasks' for every module in ``packages``." force (bool): By default this call is lazy so that the actual auto-discovery won't happen until an application imports the default modules. Forcing will cause the auto-discovery to happen immediately. """
что сработало для меня, было добавить явное имя к декоратору задачи сельдерея. Я изменил объявление задачи с
@app.tasks
to@app.tasks(name='module.submodule.task')
вот пример
# test_task.py @celery.task def test_task(): print("Celery Task !!!!") # test_task.py @celery.task(name='tasks.test.test_task') def test_task(): print("Celery Task !!!!")