Селера отримала незареєстроване завдання типу (приклад запуску)


96

Я намагаюся запустити приклад із документації 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
відповідь Айхо правильна:CELERY_IMPORTS = ("tasks", )
Альп

Відповіді:


49

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

celeryd --loglevel=INFO --settings=celeryconfig

Ви також можете встановити, --loglevel=DEBUGі ви, мабуть, повинні негайно побачити проблему.


4
+1 для --loglevel=DEBUG, у моєму завданні сталася синтаксична помилка.
Jacob Valenta

12
селера застаріла. Тепер слід бігати, celery workerнаприклад, Djangoтакcelery --app=your_app.celery worker --loglevel=info
andilabs

Для мене (селера 3.1.23) мені довелося використати, celery.registry.tasksщоб переглянути список усіх своїх поточних завдань. Ви завжди можете перевірити, запустивши dir(celery.registry).
Нік Брейді

бо і --loglevel=DEBUGз мого боку
Шобі

64

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


8
Дякую! Бажаю, щоб я знайшов це годину тому
Nexus

2
Це мені це виправило. Якщо ви використовуєте сценарії celeryd, працівник імпортує ваші модулі завдань під час запуску. Навіть якщо ви потім створите більше функцій завдання або зміните існуючі, працівник буде використовувати свої копії в пам'яті, як вони були, коли вони їх читали.
Марк

1
Примітка: Ви можете переконатися, що ваші завдання зареєстровані чи не зареєстровані, запустившиcelery inspect registered
Нік Брейді

1
Ви також можете запустити селера з опцією, --autoreloadяка перезапустить селеру при кожному зміні коду.
Сергій Ляпустін

На жаль, застаріле. Можна використати рішення за цим посиланням: avilpage.com/2017/05/…
Томаш

50

У мене була та ж проблема: причиною "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!
Антуан

27

Використовуєте ви CELERY_IMPORTSчиautodiscover_tasks , важливим моментом є те, що завдання можна знайти, а назва завдань, зареєстрованих у Celery, повинна відповідати іменам, які намагаються отримати працівники.

Скажімо celery worker -A project --loglevel=DEBUG, під час запуску Celery ви повинні побачити назву завдань. Наприклад, якщо у мене є 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збігах ім'я у списку завдань селери.


Це було дуже корисно. Назва завдання повинна відповідати клавіші 'завдання' у вашому 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) }
Морморан

16

У мене теж була та сама проблема; я додав

CELERY_IMPORTS=("mytasks")

у моєму celeryconfig.pyфайлі, щоб це вирішити.


6
Зверніть увагу, що це має бути список чи кортеж:CELERY_IMPORTS = ['my_module']
askol

Це зробило це для мене
Різьєро

12
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 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

Для мене ця помилка була вирішена шляхом забезпечення включення програми, що містить завдання, у налаштування INSTALLED_APPS django.


Крім того, завдання мали бути доступними з <app> /tasks.py
np8

3

У мене ця проблема загадково з'явилася, коли я додав деяку обробку сигналу до мого додатка django. Роблячи це, я перетворив додаток на використання AppConfig, тобто, замість того, щоб просто читати як 'booking"in" INSTALLED_APPS, він читав 'booking.app.BookingConfig'.

Селера не розуміє, що це означає, тому я додав INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)до своїх налаштувань джанго та змінив свій 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

Я також зіткнувся з цією проблемою, але вона не зовсім однакова, тому просто FYI. Нещодавні оновлення спричиняють появу цього повідомлення про помилку через синтаксис декоратора.

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

0

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


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)
        }
}

0

Додатковий пункт до справді корисного списку.

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

Останнє стосується записів дозволів у файл журналу. У мене не було проблем з розробкою або запуском селери в командному рядку, але служба повідомила про завдання як незареєстроване.

Мені потрібно було змінити дозволи на папку журналу, щоб служба могла писати на неї.


0

Мої 2 центи

Я отримував це на зображенні докера, використовуючи alpine. Налаштування django, на які посилається /dev/logреєстрація в syslog. Додаток django та селера працювали на одному і тому ж зображенні. Точка входу до зображення програми django запускалася syslogdіз запуску, але така для працівника селери - ні. Це спричиняло ./manage.py shellневдачі, оскільки таких не було /dev/log. Працівник селери не зазнав невдачі. Натомість він мовчки просто ігнорував решту запуску програми, що включало завантаження shared_taskзаписів із програм у проекті django


0

У моєму випадку помилка полягала в тому, що один контейнер створив файли в папці, які були змонтовані у хост-файловій системі за допомогою docker-compose.

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

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

(Мені довелося використовувати sudo, оскільки файли належали користувачеві root)

Версія Docker: 18.03.1


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, ))) . Без правильної конфігурації Селера не може нічого зробити.

Причина, чому вона не може знайти celeryconfig, швидше за все, вона не у вашому PYTHONPATH.


0

Я вирішив свою проблему, моє 'завдання' знаходиться під пакетом python з назвою 'celery_task' ,, коли я виходжу з цього пакета та запускаю команду celery worker -A celery_task.task --loglevel=info. Це працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.