Я пытаюсь запустить пример из документации Celery.
Я бегу: 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'
Объясните, пожалуйста, в чем проблема.
CELERY_IMPORTS = ("tasks", )
Ответы:
Вы можете увидеть текущий список зарегистрированных задач в
celery.registry.TaskRegistry
классе. Возможно, ваш celeryconfig (в текущем каталоге) отсутствует,PYTHONPATH
поэтому сельдерей не может его найти и возвращается к значениям по умолчанию. Просто укажите это явно при запуске сельдерея.Вы также можете установить
--loglevel=DEBUG
и, вероятно, сразу увидите проблему.источник
--loglevel=DEBUG
, в моей задаче была синтаксическая ошибка.celery worker
например,Django
вот такcelery --app=your_app.celery worker --loglevel=info
celery.registry.tasks
чтобы увидеть список всех моих текущих задач. Всегда можно проверить, запустивdir(celery.registry)
.--loglevel=DEBUG
меня тожеДумаю, нужно перезапустить рабочий сервер. Встречаю ту же проблему и решаю ее перезапуском.
источник
celery inspect registered
--autoreload
которая будет перезапускать сельдерей каждый раз при изменении кода.У меня была такая же проблема: причина в
"Received unregistered task of type.."
том, что служба celeryd не находила и не регистрировала задачи при запуске службы (кстати, их список виден при запуске./manage.py celeryd --loglevel=info
).Эти задачи следует указать в
CELERY_IMPORTS = ("tasks", )
файле настроек.Если у вас есть специальный
celery_settings.py
файл, он должен быть объявлен при запуске службы celeryd, как--settings=celery_settings.py
написал digivampire.источник
Независимо от того, используете ли вы
CELERY_IMPORTS
илиautodiscover_tasks
, важным моментом является то, что задачи могут быть найдены, и имена задач, зарегистрированных в Celery, должны совпадать с именами, которые рабочие пытаются получить.Например, когда вы запускаете Celery,
celery worker -A project --loglevel=DEBUG
вы должны увидеть название задач. Например, если у меня естьdebug_task
задача в моемcelery.py
.Если вы не можете видеть свои задачи в списке, пожалуйста , проверьте параметры импорта конфигурации сельдерея задачи правильно, либо
--setting
,--config
,celeryconfig
илиconfig_from_object
.Если вы используете сельдерей, убедитесь, что имя задачи,, которое
task
вы используете,CELERYBEAT_SCHEDULE
совпадает с именем в списке задач сельдерея.источник
@task(name='check_periodically')
то он должен соответствовать тому, что выCELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
У меня тоже была такая же проблема; я добавил
CELERY_IMPORTS=("mytasks")
в моем
celeryconfig.py
файле, чтобы решить эту проблему.источник
CELERY_IMPORTS = ['my_module']
app = Celery('proj', broker='amqp://', backend='amqp://', include=['proj.tasks'])
пожалуйста, include = ['proj.tasks'] Вам нужно перейти в верхний каталог , затем выполнить это
не
в вашем celeryconfig.py input import = ("path.ptah.tasks",)
пожалуйста, в другом модуле вызовите задачу !!!!!!!!
источник
include
необходимо добавить, если вы используете относительный импорт. Я решил свою проблему, добавив ееplease in other module invoke task!!!!!!!!
. Это помогло.Использование --settings для меня не помогло. Мне пришлось использовать следующее, чтобы все заработало:
Вот файл 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",)
Моя настройка была немного сложнее, потому что я использую супервизор для запуска сельдерея в качестве демона.
источник
Для меня эта ошибка была решена путем включения приложения, содержащего задачи, в настройку django INSTALLED_APPS.
источник
У меня возникла таинственная проблема, когда я добавил некоторую обработку сигналов в свое приложение 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 )
источник
Что сработало для меня, так это добавить явное имя декоратору задачи сельдерея. Я изменил объявление задачи с
@app.tasks
на@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 !!!!")
источник
У меня была такая же проблема с запуском задач из Celery Beat. Сельдерей не любит относительный импорт, поэтому в моем
celeryconfig.py
мне пришлось явно указать полное имя пакета:app.conf.beat_schedule = { 'add-every-30-seconds': { 'task': 'full.path.to.add', 'schedule': 30.0, 'args': (16, 16) }, }
источник
Это, как ни странно, также может быть из-за отсутствия пакета. Запустите pip, чтобы установить все необходимые пакеты:
pip install -r requirements.txt
autodiscover_tasks
не собирал задачи, в которых использовались отсутствующие пакеты.источник
У меня не было проблем с Django . Но столкнулся с этим, когда использовал Flask . Решением было установить параметр конфигурации.
celery worker -A app.celery --loglevel=DEBUG --config=settings
в то время как с Django у меня было только что:
python manage.py celery worker -c 2 --loglevel=info
источник
Я тоже столкнулся с этой проблемой, но это не совсем то же самое, так что просто к сведению. Последнее обновление вызывает это сообщение об ошибке из-за этого синтаксиса декоратора.
ERROR/MainProcess] Received unregistered task of type 'my_server_check'.
@task('my_server_check')
Пришлось изменить просто
@task()
Не знаю почему.
источник
Если вы используете конфигурацию приложений в установленных приложениях, например:
LOCAL_APPS = [ 'apps.myapp.apps.MyAppConfig']
Затем в своем приложении конфигурации импортируйте задачу в готовом методе следующим образом:
from django.apps import AppConfig class MyAppConfig(AppConfig): name = 'apps.myapp' def ready(self): try: import apps.myapp.signals # noqa F401 import apps.myapp.tasks except ImportError: pass
источник
Попробуйте импортировать задачу Celery в оболочку Python - Celery может молча не регистрировать ваши задачи из-за неправильного оператора импорта.
У меня было
ImportError
исключение в моем файле tasks.py, из-за которого Celery не регистрировал задачи в модуле. Все остальные задачи модуля были зарегистрированы правильно.Эта ошибка не была очевидна, пока я не попытался импортировать задачу Celery в оболочку Python. Я исправил неверный оператор импорта, и задачи были успешно зарегистрированы.
источник
Если вы столкнулись с такой ошибкой, существует ряд возможных причин, но решение, которое я нашел, заключалось в том, что мой файл конфигурации celeryd в / etc / defaults / celeryd был настроен для стандартного использования, а не для моего конкретного проекта django. Как только я преобразовал его в формат, указанный в документации о сельдерее , все было хорошо.
источник
Решение для меня добавить эту строку в / etc / default / celeryd
CELERYD_OPTS="-A tasks"
Потому что, когда я запускаю эти команды:
Только последняя команда вообще показывала названия задач.
Я также попытался добавить строку CELERY_APP / etc / default / celeryd, но это тоже не сработало.
CELERY_APP="tasks"
источник
У меня была проблема с классами PeriodicTask в django-celery, в то время как их имена отлично отображались при запуске рабочего сельдерея при каждом запуске:
KeyError: u'my_app.tasks.run '
Моей задачей был класс под названием «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
все ок.источник
Я обнаружил, что один из наших программистов добавил к одному из импортируемых файлов следующую строку:
Это привело к тому, что работник Celery сменил свой рабочий каталог с рабочего каталога проектов по умолчанию (где он мог найти задачи) в другой каталог (где он не мог найти задачи).
После удаления этой строчки кода все задачи были найдены и зарегистрированы.
источник
Сельдерей не поддерживает относительный импорт, поэтому в моем celeryconfig.py вам нужен абсолютный импорт.
CELERYBEAT_SCHEDULE = { 'add_num': { 'task': 'app.tasks.add_num.add_nums', 'schedule': timedelta(seconds=10), 'args': (1, 2) } }
источник
Дополнительный пункт к действительно полезному списку.
Я обнаружил, что Celery неумолим в отношении ошибок в задачах (или, по крайней мере, мне не удалось отследить соответствующие записи журнала), и он не регистрирует их. У меня был ряд проблем с запуском Celery как службы, которые в основном были связаны с разрешениями.
Последнее связано с записью разрешений в файл журнала. У меня не было проблем с разработкой или запуском сельдерея в командной строке, но служба сообщила, что задача не зарегистрирована.
Мне нужно было изменить права доступа к папке журнала, чтобы служба могла писать в нее.
источник
Мои 2 цента
Я получал это в образе докера с помощью alpine. Параметры django, используемые
/dev/log
для записи в системный журнал. Приложение django и celery worker были основаны на одном и том же изображении. Точка входа в образ приложения django запускаласьsyslogd
при запуске, а точка входа для сельдерея - нет. Это приводило./manage.py shell
к сбою, потому что ничего не было/dev/log
. Работник сельдерея не прогадал. Вместо этого он просто игнорировал остальную часть запуска приложения, которая включала загрузкуshared_task
записей из приложений в проекте django.источник
В моем случае ошибка была связана с тем, что один контейнер создал файлы в папке, которые были смонтированы в файловой системе хоста с помощью docker-compose.
Мне просто нужно было удалить файлы, созданные контейнером в хост-системе, и я снова смог запустить свой проект.
(Мне пришлось использовать 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.conf.beat_schedule = { 'send-task': { 'task': 'appdir.tasks.testapp', 'schedule': crontab(minute='*/5'), },
}
источник
при запуске сельдерея с помощью команды «celery -A conf worker -l info» все задачи были перечислены в журнале, как и я. conf.celery.debug_task я получал ошибку, потому что я не указывал точный путь к задаче. Пожалуйста, перепроверьте это, скопировав и вставив точный идентификатор задачи.
источник
app = Celery(__name__, broker=app.config['CELERY_BROKER'], backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])
источник
Ответ на ваши проблемы лежат в первой строке вывода вы указали в своем вопросе:
/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, )))
. Без правильной настройки Celery ничего не умеет.Причина, по которой он не может найти celeryconfig, скорее всего, не в вашем PYTHONPATH.
источник