Сельдерей получил незарегистрированное задание типа (пример запуска) - PullRequest
77 голосов
/ 19 марта 2012

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

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

Ответы [ 28 ]

2 голосов
/ 13 октября 2018

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

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

2 голосов
/ 20 июня 2018

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

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

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

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

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

1 голос
/ 18 марта 2014

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

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

@task('my_server_check')

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

@task()

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

0 голосов
/ 16 декабря 2012

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

0 голосов
/ 31 мая 2018

Если вы используете 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 голосов
/ 09 мая 2018

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

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

sudo rm -Rf имя_фолдера

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

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

0 голосов
/ 25 июля 2014

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

KeyError: u'my_app.tasks.run '

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

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

0 голосов
/ 28 декабря 2017

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

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

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

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

0 голосов
/ 16 октября 2017

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

CELERYBEAT_SCHEDULE = {
        'add_num': {
            'task': 'app.tasks.add_num.add_nums',
            'schedule': timedelta(seconds=10),
            'args': (1, 2)
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...