Sellerie Nicht registrierte Aufgabe vom Typ erhalten (Beispiel ausführen)


95

Ich versuche, ein Beispiel aus der Sellerie-Dokumentation auszuführen .

Ich renne: 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

task.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())

Im selben Ordner celeryconfig.py:

CELERY_IMPORTS = ("tasks", )
CELERY_RESULT_BACKEND = "amqp"
BROKER_URL = "amqp://guest:guest@localhost:5672//"
CELERY_TASK_RESULT_EXPIRES = 300

Wenn ich "run_task.py" starte:

auf der Python-Konsole

eb503f77-b5fc-44e2-ac0b-91ce6ddbf153
False

Fehler auf dem Celeryd Server

[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'

Bitte erklären Sie, wo das Problem liegt.


12
Hallo, können Sie uns bitte mitteilen, was das Problem war und wie Sie es gelöst haben? Die akzeptierte Antwort macht nicht klar, wie andere dieses Problem lösen könnten. Vielen Dank.
Jordan Reiter

3
Ich bin bei Jordan - das war überhaupt nicht nützlich. Abgestimmt.
Jay Taylor

2
Die Antwort von Aiho ist die richtige:CELERY_IMPORTS = ("tasks", )
Alp

Antworten:


49

Sie können die aktuelle Liste der registrierten Aufgaben in der celery.registry.TaskRegistryKlasse anzeigen. Möglicherweise befindet sich Ihre celeryconfig (im aktuellen Verzeichnis) nicht in, PYTHONPATHsodass Sellerie sie nicht finden kann und auf die Standardeinstellungen zurückgreift. Geben Sie es einfach explizit an, wenn Sie mit Sellerie beginnen.

celeryd --loglevel=INFO --settings=celeryconfig

Sie können auch einstellen --loglevel=DEBUGund Sie sollten das Problem wahrscheinlich sofort sehen.


4
+1 für --loglevel=DEBUG, es gab einen Syntaxfehler in meiner Aufgabe.
Jacob Valenta

11
Celeryd ist veraltet. Nun sollte man laufen celery workerzB für Djangowie diesecelery --app=your_app.celery worker --loglevel=info
andilabs

Für mich (Sellerie 3.1.23) musste ich celery.registry.taskseine Liste aller meiner aktuellen Aufgaben anzeigen . Sie können jederzeit überprüfen, indem Sie ausführen dir(celery.registry).
Nick Brady

für auch --loglevel=DEBUGvon meiner Seite
Shobi

64

Ich denke, Sie müssen den Worker-Server neu starten. Ich treffe das gleiche Problem und löse es durch einen Neustart.


8
Vielen Dank! Ich wünschte, ich hätte das vor einer Stunde gefunden
Nexus

2
Das hat es für mich behoben. Wenn Sie Celeryd-Skripte verwenden, importiert der Worker Ihre Task-Module beim Start. Selbst wenn Sie dann weitere Aufgabenfunktionen erstellen oder vorhandene ändern, verwendet der Worker seine speicherinternen Kopien so, wie sie beim Lesen waren.
Mark

1
Hinweis: Sie können überprüfen, ob Ihre Aufgaben registriert sind oder nicht, indem Sie ausführencelery inspect registered
Nick Brady

1
Sie können Sellerie auch mit der Option --autoreloadstarten, mit der Sellerie jedes Mal neu gestartet wird, wenn der Code geändert wurde.
Sergey Lyapustin

Leider veraltet. Man könnte eine Lösung von diesem Link verwenden: avilpage.com/2017/05/…
Tomasz Szkudlarek

50

Ich hatte das gleiche Problem: Der Grund dafür "Received unregistered task of type.."war, dass der celeryd-Dienst die Aufgaben beim Start des Dienstes nicht gefunden und registriert hat (übrigens ist ihre Liste beim Starten sichtbar ./manage.py celeryd --loglevel=info).

Diese Aufgaben sollten CELERY_IMPORTS = ("tasks", )in der Einstellungsdatei deklariert werden.
Wenn Sie eine spezielle celery_settings.pyDatei haben, muss diese beim Start des celeryd-Dienstes wie --settings=celery_settings.pyvon digivampire beschrieben deklariert werden.


1
Danke, ich hatte tatsächlich das Problem, weil ich Sellerie mit ~ / path / to / celery / celeryd gestartet habe, anstatt den Befehl manage.py zu verwenden!
Antoine

27

Unabhängig davon, ob Sie CELERY_IMPORTSoder verwenden autodiscover_tasks, ist der wichtige Punkt, dass die Aufgaben gefunden werden können und der Name der in Sellerie registrierten Aufgaben mit den Namen übereinstimmen sollte, die die Mitarbeiter abrufen möchten.

Wenn Sie beispielsweise den Sellerie starten celery worker -A project --loglevel=DEBUG, sollten Sie den Namen der Aufgaben sehen. Zum Beispiel, wenn ich eine debug_taskAufgabe in meinem habe 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

Wenn Sie nicht Ihre Aufgaben in der Liste sehen können, überprüfen Sie bitte Ihre Sellerie Konfiguration importiert die Aufgaben richtig, entweder in --setting, --config, celeryconfigoder config_from_object.

Wenn Sie Sellerie-Beat verwenden, stellen Sie sicher, dass der Aufgabenname task, den Sie verwenden, CELERYBEAT_SCHEDULEmit dem Namen in der Sellerie-Aufgabenliste übereinstimmt.


Das war sehr hilfreich. Der Name der Aufgabe muss mit dem Schlüssel 'Aufgabe' in Ihrem CELERYBEAT_SCHEDULE
ss_millionaire

* Der wichtige Punkt ist, dass die Aufgaben gefunden werden können und der Name der in Sellerie registrierten Aufgaben mit den Namen übereinstimmen sollte, die die Arbeiter abrufen möchten. * Guter Punkt!!!
Light.G

Dies ist die richtige Antwort. Ihr Aufgabenname im BEAT_SCHEDULER sollte mit dem übereinstimmen, was in der Liste der automatisch erkannten Aufgaben angezeigt wird. Wenn Sie also verwendet @task(name='check_periodically')haben, sollte es mit dem übereinstimmen, was Sie in den Beat-Zeitplan aufgenommen haben. IE:CELERY_BEAT_SCHEDULE = { 'check_periodically': { 'task': 'check_periodically', 'schedule': timedelta(seconds=1) }
Mormoran

16

Ich hatte auch das gleiche Problem; Ich fügte hinzu

CELERY_IMPORTS=("mytasks")

in meiner celeryconfig.pyDatei, um es zu lösen.


6
Beachten Sie, dass dies eine Liste oder ein Tupel sein sollte:CELERY_IMPORTS = ['my_module']
fragtol

Das hat es für mich
getan

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

Bitte einschließen = ['proj.tasks'] Sie müssen in das oberste Verzeichnis gehen und dies dann ausführen

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

nicht

celery -A celeryapp worker --loglevel=info

in Ihrer celeryconfig.py Eingabe imports = ("path.ptah.tasks",)

Bitte in einem anderen Modul Aufgabe aufrufen !!!!!!!!


1
Der includeParameter muss hinzugefügt werden, wenn Sie relative Importe verwenden. Ich habe mein Problem durch Hinzufügen gelöst
CK.Nguyen

1
Hat Ihre Antwort für diese Zeichenfolge gewählt please in other module invoke task!!!!!!!!. Es half.
VolArt

8

Die Verwendung von --settings hat bei mir nicht funktioniert. Ich musste Folgendes verwenden, um alles zum Laufen zu bringen:

celery --config=celeryconfig --loglevel=INFO

Hier ist die celeryconfig-Datei, der CELERY_IMPORTS hinzugefügt wurde:

# 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",)

Mein Setup war etwas kniffliger, da ich Supervisor verwende, um Sellerie als Daemon zu starten.


8

Für mich wurde dieser Fehler behoben, indem sichergestellt wurde, dass die App mit den Aufgaben in der Einstellung INSTALLED_APPS von django enthalten war.


Außerdem mussten die Aufgaben von <app> /tasks.py
np8

3

Ich hatte dieses Problem auf mysteriöse Weise, als ich meiner Django-App eine Signalverarbeitung hinzufügte. Dabei habe ich die App so konvertiert, dass sie eine AppConfig verwendet, was bedeutet, dass sie nicht einfach als 'booking'in' INSTALLED_APPS, sondern gelesen wird 'booking.app.BookingConfig'.

Sellerie versteht nicht, was das bedeutet, also habe ich INSTALLED_APPS_WITH_APPCONFIGS = ('booking',)meine Django-Einstellungen hinzugefügt und meine celery.pyvon geändert

app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

zu

app.autodiscover_tasks(
    lambda: settings.INSTALLED_APPS + settings.INSTALLED_APPS_WITH_APPCONFIGS
)

3

Was für mich funktionierte, war, dem Sellerie-Aufgabendekorateur einen expliziten Namen hinzuzufügen. Ich habe meine Aufgabenerklärung von @app.tasksauf geändert@app.tasks(name='module.submodule.task')

Hier ist ein Beispiel

# 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

Ich hatte das gleiche Problem beim Ausführen von Aufgaben von Celery Beat. Sellerie mag keine relativen Importe, daher celeryconfig.pymusste ich in meinem explizit den vollständigen Paketnamen festlegen:

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

Ich wünschte, die Sellerie-Dokumente hätten mehr Beispiele mit vollständigen Paketnamen. Nachdem ich in dieser Antwort full.path.to.add gesehen hatte, stellte ich fest, dass ich die Importe nicht benötigte. Ich wusste, dass die Lösung einfach war und brauchte nur ein besseres Beispiel für die app.conf.beat_schedule.
Zerocog

2

Dies kann seltsamerweise auch an einem fehlenden Paket liegen. Führen Sie pip aus, um alle erforderlichen Pakete zu installieren: pip install -r requirements.txt

autodiscover_tasks nahm keine Aufgaben auf, bei denen fehlende Pakete verwendet wurden.


1
Ich hatte ein ähnliches Problem. Ich denke, was passiert, ist eine Ausnahme während des Imports, die dazu führt, dass Teile der automatischen Erkennung nicht abgeschlossen werden.
Tim Tisdall

Ahh ja, macht Sinn. Danke
Kakoma

1

Ich hatte kein Problem mit Django . Aber ich bin darauf gestoßen, als ich Flask benutzt habe . Die Lösung bestand darin, die Konfigurationsoption festzulegen.

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

Während ich mit Django zusammen war, hatte ich gerade:

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


1

Ich bin auch auf dieses Problem gestoßen, aber es ist nicht ganz dasselbe, also nur zu Ihrer Information. Jüngste Upgrades verursachen diese Fehlermeldung aufgrund dieser Decorator-Syntax.

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

@task('my_server_check')

Musste einfach ändern

@task()

Keine Ahnung warum.


1

Wenn Sie die Apps-Konfiguration in installierten Apps wie folgt verwenden:

LOCAL_APPS = [
'apps.myapp.apps.MyAppConfig']

Importieren Sie dann in Ihrer Konfigurations-App die Aufgabe in der folgenden Bereitschaftsmethode:

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

Wenn Sie auf diese Art von Fehler stoßen, gibt es eine Reihe möglicher Ursachen, aber die Lösung, die ich gefunden habe, war, dass meine celeryd-Konfigurationsdatei in / etc / defaults / celeryd für die Standardverwendung konfiguriert wurde, nicht für mein spezifisches Django-Projekt. Sobald ich es in das in den Sellerie-Dokumenten angegebene Format konvertiert hatte , war alles in Ordnung .


0

Die Lösung für mich, diese Zeile zu / etc / default / celeryd hinzuzufügen

CELERYD_OPTS="-A tasks"

Denn wenn ich diese Befehle ausführe:

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

Nur der letztere Befehl zeigte überhaupt Aufgabennamen an.

Ich habe auch versucht, die CELERY_APP-Zeile / etc / default / celeryd hinzuzufügen, aber das hat auch nicht funktioniert.

CELERY_APP="tasks"

0

Ich hatte das Problem mit PeriodicTask-Klassen in Django-Sellerie, während ihre Namen beim Starten des Sellerie-Arbeiters bei jeder ausgelösten Ausführung gut auftauchten:

KeyError: u'my_app.tasks.run '

Meine Aufgabe war eine Klasse namens 'CleanUp', nicht nur eine Methode namens 'run'.

Als ich die Tabelle 'djcelery_periodictask' überprüfte, sah ich veraltete Einträge und löschte sie, um das Problem zu beheben.


0

Nur um meine zwei Cent für meinen Fall mit diesem Fehler hinzuzufügen ...

Mein Weg ist /vagrant/devops/testmit app.pyund __init__.pydarin.

Wenn ich laufe, cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=infoerhalte ich diesen Fehler.

Aber wenn ich es laufen cd /vagrant/devops/test && celery worker -A app.celery --loglevel=infolasse, ist alles in Ordnung.


0

Ich habe festgestellt, dass einer unserer Programmierer einem der Importe die folgende Zeile hinzugefügt hat:

os.chdir(<path_to_a_local_folder>)

Dies führte dazu, dass der Sellerie-Mitarbeiter sein Arbeitsverzeichnis vom Standardarbeitsverzeichnis des Projekts (in dem die Aufgaben gefunden werden konnten) in ein anderes Verzeichnis (in dem die Aufgaben nicht gefunden werden konnten) änderte.

Nach dem Entfernen dieser Codezeile wurden alle Aufgaben gefunden und registriert.


0

Sellerie unterstützt keine relativen Importe, daher benötigen Sie in meiner celeryconfig.py einen absoluten Import.

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

0

Ein zusätzliches Element zu einer wirklich nützlichen Liste.

Ich habe festgestellt, dass Sellerie in Bezug auf Fehler in Aufgaben unversöhnlich ist (oder zumindest die entsprechenden Protokolleinträge nicht nachverfolgen konnte), und er registriert sie nicht. Ich hatte eine Reihe von Problemen beim Ausführen von Sellerie als Dienst, die hauptsächlich mit Berechtigungen zusammenhängen.

Die neuesten Informationen beziehen sich auf Berechtigungen, die in eine Protokolldatei geschrieben werden. Ich hatte keine Probleme bei der Entwicklung oder beim Ausführen von Sellerie in der Befehlszeile, aber der Dienst meldete die Aufgabe als nicht registriert.

Ich musste die Berechtigungen für den Protokollordner ändern, damit der Dienst darauf schreiben konnte.


0

Meine 2 Cent

Ich habe dies in einem Docker-Bild mit alpinen bekommen. Die Django-Einstellungen, auf die /dev/logfür die Protokollierung in Syslog verwiesen wird . Die Django-App und der Sellerie-Arbeiter basierten beide auf demselben Bild. Der Einstiegspunkt des Django-App-Images wurde beim Start syslogdgestartet, der für den Sellerie-Arbeiter jedoch nicht. Dies führte dazu, dass Dinge wie ./manage.py shellscheiterten, weil es keine gab /dev/log. Der Sellerie-Arbeiter versagte nicht. Stattdessen ignorierte es stillschweigend nur den Rest des App-Starts, der das Laden von shared_taskEinträgen aus Anwendungen im Django-Projekt beinhaltete


0

In meinem Fall lag der Fehler darin, dass ein Container Dateien in einem Ordner erstellt hat, die mit Docker-Compose auf dem Host-Dateisystem bereitgestellt wurden.

Ich musste nur die vom Container auf dem Hostsystem erstellten Dateien entfernen und konnte mein Projekt erneut starten.

sudo rm -Rf Ordnername

(Ich musste sudo verwenden, da die Dateien dem Root-Benutzer gehörten.)

Docker-Version: 18.03.1


0

Wenn Sie verwenden autodiscover_tasks, stellen Sie sicher, dass Ihre functionszu registrierende tasks.pyDatei in der , nicht in einer anderen Datei bleibt . Oder Sellerie kann das, was functionsSie registrieren möchten, nicht finden .

Verwendung app.register_taskwird auch die Arbeit erledigen, scheint aber ein wenig naiv.

Bitte beachten Sie diese offizielle Spezifikation von 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

Schreiben Sie den richtigen Pfad zu den Dateiaufgaben

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

}}


0

Beim Ausführen des Selleries mit dem Befehl "Sellerie - Ein Conf Worker -l Info" wurden alle Aufgaben im Protokoll aufgelistet, wie ich es getan habe. conf.celery.debug_task Ich habe den Fehler erhalten, weil ich nicht genau diesen Aufgabenpfad angegeben habe. Überprüfen Sie dies bitte erneut, indem Sie die genaue Aufgaben-ID kopieren und einfügen.


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

0

Die Antwort auf Ihr Problem liegt in DER ERSTEN LINIE der Ausgabe, die Sie in Ihrer Frage angegeben haben: /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, ))) . Ohne die richtige Konfiguration kann Sellerie nichts tun.

Der Grund, warum die Selleriekonfiguration nicht gefunden werden kann, liegt höchstwahrscheinlich nicht in Ihrem PYTHONPATH.


0

Sellerie importiert die Aufgabe nicht, wenn der App einige ihrer Abhängigkeiten fehlen. Beispielsweise importiert eine app.view numpy, ohne dass es installiert ist. Der beste Weg, dies zu überprüfen, besteht darin, zu versuchen, Ihren Django-Server auszuführen, wie Sie wahrscheinlich wissen:

python manage.py runserver

Sie haben das Problem gefunden, wenn dies ImportErrors in der App auslöst, in der sich die jeweilige Aufgabe befindet. Installieren Sie einfach alles oder versuchen Sie, die Abhängigkeiten zu entfernen, und versuchen Sie es erneut. Dies ist sonst nicht die Ursache für Ihr Problem.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.