Celery Получена незарегистрированная задача типа (пример выполнения)

99

Я пытаюсь запустить пример из документации 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'

Объясните, пожалуйста, в чем проблема.

Эчег
источник
12
Привет, не могли бы вы рассказать, в чем была проблема и как вы ее решили? Принятый ответ не проясняет, как другие могут решить эту проблему. Спасибо.
Джордан Рейтер
3
Я с Джорданом - это совершенно бесполезно. Проголосовали против.
Джей Тейлор,
2
ответ aiho правильный:CELERY_IMPORTS = ("tasks", )
Alp

Ответы:

50

Вы можете увидеть текущий список зарегистрированных задач в celery.registry.TaskRegistryклассе. Возможно, ваш celeryconfig (в текущем каталоге) отсутствует, PYTHONPATHпоэтому сельдерей не может его найти и возвращается к значениям по умолчанию. Просто укажите это явно при запуске сельдерея.

celeryd --loglevel=INFO --settings=celeryconfig

Вы также можете установить --loglevel=DEBUGи, вероятно, сразу увидите проблему.

Астеванович
источник
5
+1 за --loglevel=DEBUG, в моей задаче была синтаксическая ошибка.
Jacob Valenta
15
сельдерей устарел. Теперь нужно бежать, celery workerнапример, Djangoвот такcelery --app=your_app.celery worker --loglevel=info
andilabs
Для меня (сельдерей 3.1.23) мне пришлось использовать, celery.registry.tasksчтобы увидеть список всех моих текущих задач. Всегда можно проверить, запустив dir(celery.registry).
Ник Брэди,
для --loglevel=DEBUGменя тоже
Шоби
65

Думаю, нужно перезапустить рабочий сервер. Встречаю ту же проблему и решаю ее перезапуском.

Вэй Ан
источник
8
Благодарность! Хотел бы я найти это час назад
Nexus
2
Это исправило это для меня. Если вы используете скрипты celeryd, воркер импортирует ваши модули задач при запуске. Даже если вы затем создадите больше функций задачи или измените существующие, рабочий будет использовать свои копии в памяти, как и при их чтении.
Марк
2
Примечание: вы можете проверить, зарегистрированы ли ваши задачи или нет, запустивcelery inspect registered
Ник Брэди,
1
Вы также можете запустить сельдерей с опцией, --autoreloadкоторая будет перезапускать сельдерей каждый раз при изменении кода.
Сергей Ляпустин
К сожалению, не рекомендуется. Можно использовать решение по этой ссылке: avilpage.com/2017/05/…
Томаш Шкудларек
51

У меня была такая же проблема: причина в "Received unregistered task of type.."том, что служба celeryd не находила и не регистрировала задачи при запуске службы (кстати, их список виден при запуске ./manage.py celeryd --loglevel=info).

Эти задачи следует указать в CELERY_IMPORTS = ("tasks", )файле настроек.
Если у вас есть специальный celery_settings.pyфайл, он должен быть объявлен при запуске службы celeryd, как --settings=celery_settings.pyнаписал digivampire.

иголкотек
источник
1
Спасибо, у меня действительно возникла проблема, потому что я начал использовать сельдерей с помощью ~ / path / to / celery / celeryd вместо использования команды manage.py!
Антуан
29

Независимо от того, используете ли вы CELERY_IMPORTSили autodiscover_tasks, важным моментом является то, что задачи могут быть найдены, и имена задач, зарегистрированных в Celery, должны совпадать с именами, которые рабочие пытаются получить.

Например, когда вы запускаете Celery, 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совпадает с именем в списке задач сельдерея.

Ши-Вен Су
источник
Это было очень полезно. Имя задачи должно соответствовать ключу 'task' в вашем CELERYBEAT_SCHEDULE
ss_millionaire
* Важным моментом является то, что задачи можно найти, и имена задач, зарегистрированных в Celery, должны совпадать с именами, которые рабочие пытаются получить. * Хорошая точка зрения!!!
Light.G
Это правильный ответ. Имя вашей задачи в BEAT_SCHEDULER должно совпадать с тем, что отображается в списке автоматически обнаруженных задач. Так что, если вы использовали, @task(name='check_periodically')то он должен соответствовать тому, что вы CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
битов
17

У меня тоже была такая же проблема; я добавил

CELERY_IMPORTS=("mytasks")

в моем celeryconfig.pyфайле, чтобы решить эту проблему.

Рохиташв Сингхал
источник
7
Обратите внимание, что это должен быть список или кортеж:CELERY_IMPORTS = ['my_module']
asksol
Это сделало это для меня
Ризьеро
13
app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

пожалуйста, include = ['proj.tasks'] Вам нужно перейти в верхний каталог , затем выполнить это

celery -A app.celery_module.celeryapp worker --loglevel=info

не

celery -A celeryapp worker --loglevel=info

в вашем celeryconfig.py input import = ("path.ptah.tasks",)

пожалуйста, в другом модуле вызовите задачу !!!!!!!!

привет
источник
1
Параметр includeнеобходимо добавить, если вы используете относительный импорт. Я решил свою проблему, добавив ее
CK.Nguyen
1
Проголосовал за ваш ответ для этой строки please in other module invoke task!!!!!!!!. Это помогло.
VolArt
8

Использование --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",)

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

Джари Боландер
источник
8

Для меня эта ошибка была решена путем включения приложения, содержащего задачи, в настройку django INSTALLED_APPS.

машины
источник
Кроме того, задачи должны быть доступны из <app> /tasks.py
np8,
3

У меня возникла таинственная проблема, когда я добавил некоторую обработку сигналов в свое приложение django. При этом я преобразовал приложение для использования AppConfig, что означает, что вместо того, чтобы просто читать как 'bookingin INSTALLED_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
)
Адам Барнс
источник
3

Что сработало для меня, так это добавить явное имя декоратору задачи сельдерея. Я изменил объявление задачи с @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  !!!!")
Лукаш Дыновски
источник
2

У меня была такая же проблема с запуском задач из Celery Beat. Сельдерей не любит относительный импорт, поэтому в моем celeryconfig.pyмне пришлось явно указать полное имя пакета:

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}
Джастин Регеле
источник
Хотелось бы, чтобы в документации по сельдерею было больше примеров с полными именами пакетов. Увидев в этом ответе full.path.to.add, я обнаружил, что импорт мне не нужен. Я знал, что решение было простым, и мне просто нужно было иметь лучший пример app.conf.beat_schedule.
zerocog
2

Это, как ни странно, также может быть из-за отсутствия пакета. Запустите pip, чтобы установить все необходимые пакеты: pip install -r requirements.txt

autodiscover_tasks не собирал задачи, в которых использовались отсутствующие пакеты.

какома
источник
1
У меня была аналогичная проблема. Я думаю, что происходит исключение во время импорта, из-за которого части автоматического обнаружения не завершаются.
Тим Тисдалл
Ах да, имеет смысл. Спасибо
kakoma
1

У меня не было проблем с Django . Но столкнулся с этим, когда использовал Flask . Решением было установить параметр конфигурации.

celery worker -A app.celery --loglevel=DEBUG --config=settings

в то время как с Django у меня было только что:

python manage.py celery worker -c 2 --loglevel=info

Нихал Шарма
источник
1

Я тоже столкнулся с этой проблемой, но это не совсем то же самое, так что просто к сведению. Последнее обновление вызывает это сообщение об ошибке из-за этого синтаксиса декоратора.

ERROR/MainProcess] Received unregistered task of type 'my_server_check'.

@task('my_server_check')

Пришлось изменить просто

@task()

Не знаю почему.

каменная ярость
источник
1

Если вы используете конфигурацию приложений в установленных приложениях, например:

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
Гурав Чавла
источник
1

Попробуйте импортировать задачу Celery в оболочку Python - Celery может молча не регистрировать ваши задачи из-за неправильного оператора импорта.

У меня было ImportErrorисключение в моем файле tasks.py, из-за которого Celery не регистрировал задачи в модуле. Все остальные задачи модуля были зарегистрированы правильно.

Эта ошибка не была очевидна, пока я не попытался импортировать задачу Celery в оболочку Python. Я исправил неверный оператор импорта, и задачи были успешно зарегистрированы.

Сантос Солорзано
источник
Так было и со мной. Отсутствовал импорт. Проблема в том, что сельдерей просто не работает.
Редгрен Грумбхолдт
0

Если вы столкнулись с такой ошибкой, существует ряд возможных причин, но решение, которое я нашел, заключалось в том, что мой файл конфигурации celeryd в / etc / defaults / celeryd был настроен для стандартного использования, а не для моего конкретного проекта django. Как только я преобразовал его в формат, указанный в документации о сельдерее , все было хорошо.

tufelkinder
источник
0

Решение для меня добавить эту строку в / etc / default / celeryd

CELERYD_OPTS="-A tasks"

Потому что, когда я запускаю эти команды:

celery worker --loglevel=INFO
celery worker -A tasks --loglevel=INFO

Только последняя команда вообще показывала названия задач.

Я также попытался добавить строку CELERY_APP / etc / default / celeryd, но это тоже не сработало.

CELERY_APP="tasks"
усталость
источник
0

У меня была проблема с классами PeriodicTask в django-celery, в то время как их имена отлично отображались при запуске рабочего сельдерея при каждом запуске:

KeyError: u'my_app.tasks.run '

Моей задачей был класс под названием «CleanUp», а не просто метод под названием «run».

Когда я проверил таблицу djcelery_periodictask, я увидел устаревшие записи, и их удаление устранило проблему.

Джангонавт
источник
0

Просто чтобы добавить два цента за мой случай с этой ошибкой ...

Мой путь /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все ок.

Костас Демирис
источник
0

Я обнаружил, что один из наших программистов добавил к одному из импортируемых файлов следующую строку:

os.chdir(<path_to_a_local_folder>)

Это привело к тому, что работник Celery сменил свой рабочий каталог с рабочего каталога проектов по умолчанию (где он мог найти задачи) в другой каталог (где он не мог найти задачи).

После удаления этой строчки кода все задачи были найдены и зарегистрированы.

Амит Зицман
источник
0

Сельдерей не поддерживает относительный импорт, поэтому в моем celeryconfig.py вам нужен абсолютный импорт.

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}
Eds_k
источник
0

Дополнительный пункт к действительно полезному списку.

Я обнаружил, что Celery неумолим в отношении ошибок в задачах (или, по крайней мере, мне не удалось отследить соответствующие записи журнала), и он не регистрирует их. У меня был ряд проблем с запуском Celery как службы, которые в основном были связаны с разрешениями.

Последнее связано с записью разрешений в файл журнала. У меня не было проблем с разработкой или запуском сельдерея в командной строке, но служба сообщила, что задача не зарегистрирована.

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

МюррейAusUK
источник
0

Мои 2 цента

Я получал это в образе докера с помощью alpine. Параметры django, используемые /dev/logдля записи в системный журнал. Приложение django и celery worker были основаны на одном и том же изображении. Точка входа в образ приложения django запускалась syslogdпри запуске, а точка входа для сельдерея - нет. Это приводило ./manage.py shellк сбою, потому что ничего не было /dev/log. Работник сельдерея не прогадал. Вместо этого он просто игнорировал остальную часть запуска приложения, которая включала загрузку shared_taskзаписей из приложений в проекте django.

Шади
источник
0

В моем случае ошибка была связана с тем, что один контейнер создал файлы в папке, которые были смонтированы в файловой системе хоста с помощью docker-compose.

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

sudo rm -Rf имя папки

(Мне пришлось использовать sudo, потому что файлы принадлежали пользователю root)

Версия докера: 18.03.1

Jjacobi
источник
0

Если вы используете 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.
    """
В. Перрен
источник
0

Напишите правильный путь к файлу задач

app.conf.beat_schedule = {
'send-task': {
    'task': 'appdir.tasks.testapp',
    'schedule': crontab(minute='*/5'),  
},

}

Кайрат Койбагаров
источник
0

при запуске сельдерея с помощью команды «celery -A conf worker -l info» все задачи были перечислены в журнале, как и я. conf.celery.debug_task я получал ошибку, потому что я не указывал точный путь к задаче. Пожалуйста, перепроверьте это, скопировав и вставив точный идентификатор задачи.

Чаудхари Накаш Субтайн
источник
0
app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])
张春吉
источник
0

Ответ на ваши проблемы лежат в первой строке вывода вы указали в своем вопросе: /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.

ДеянЛекич
источник