Подтвердить что ты не робот

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

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

Я запускаю: 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]  

 -------------- [email protected] v2.5.1
---- **** -----
--- * ***  * -- [Configuration]
-- * - **** ---   . broker:      amqp://[email protected]: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:[email protected]: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'

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

4b9b3361

Ответ 1

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

celeryd --loglevel=INFO --settings=celeryconfig

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

CELERY_IMPORTS=("mytasks")

в моем файле celeryconfig.py для его решения.

Ответ 6

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

Ответ 7

app = Celery('proj',
             broker='amqp://',
             backend='amqp://',
             include=['proj.tasks'])

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

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

не

celery -A celeryapp worker --loglevel=info

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

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

Ответ 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",)

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

Ответ 9

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

Ответ 10

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

app.conf.beat_schedule = {
   'add-every-30-seconds': {
        'task': 'full.path.to.add',
        'schedule': 30.0,
        'args': (16, 16)
    },
}

Ответ 11

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

Ответ 12

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

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

Ответ 13

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

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

@task('my_server_check')

Должно быть изменить только

@task()

Понятия не имею, почему.

Ответ 14

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

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

в то время как с Джанго, я просто имел:

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

Ответ 15

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

Ответ 16

Решение для меня добавить эту строку в /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"

Ответ 17

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

KeyError: u'my_app.tasks.run '

Моя задача - это класс с именем "CleanUp", а не только метод "run".

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

Ответ 18

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

os.chdir(<path_to_a_local_folder>)

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

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

Ответ 19

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

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

Ответ 20

Моя версия сельдерея 4.0.2 (latentcall). Я использую autodiscover_tasks(). У меня была та же проблема, потому что я не активировал свою среду python.

Надеюсь, это поможет.

Ответ 21

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

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}

Ответ 22

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

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

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

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

Ответ 23

Мои 2 цента

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

Ответ 24

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

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

sudo rm -Rf foldername

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

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

Ответ 25

Если вы используете autodiscover_tasks, убедитесь, что регистрируемые вами functions остаются в tasks.py, а не в любом другом файле. Или сельдерей не может найти functions вы хотите зарегистрировать.

Использование app.register_task также 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.
    """

Ответ 26

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

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

}

Ответ 27

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

Ответ 28

app = Celery(__name__, broker=app.config['CELERY_BROKER'], 
backend=app.config['CELERY_BACKEND'], include=['util.xxxx', 'util.yyyy'])

Ответ 29

Ответ на вашу проблему находится в ПЕРВОЙ ЛИНИИ вывода, который вы предоставили в своем вопросе: /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, ))) /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, ))) /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.

Ответ 30

Celery не будет импортировать задачу, если приложению не хватало некоторых зависимостей. Например, app.view импортирует numpy без его установки. Лучший способ проверить это - попытаться запустить сервер django, как вы, вероятно, знаете:

python manage.py runserver

Вы обнаружили проблему, если это вызывает ImportErrors в приложении, в котором находится соответствующая задача. Просто установите pip или попробуйте удалить зависимости и попробуйте снова. В противном случае это не является причиной вашей проблемы.