Сельдерей получил незарегистрированную задачу типа (пример выполнения)


Я пытаюсь запустить пример из сельдерея документации.

Я бегу: 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 66

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 ' in 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
)

у меня была такая же проблема с запуском задач из 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  !!!!")