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.
CELERY_IMPORTS = ("tasks", )
Antworten:
Sie können die aktuelle Liste der registrierten Aufgaben in der
celery.registry.TaskRegistry
Klasse anzeigen. Möglicherweise befindet sich Ihre celeryconfig (im aktuellen Verzeichnis) nicht in,PYTHONPATH
sodass Sellerie sie nicht finden kann und auf die Standardeinstellungen zurückgreift. Geben Sie es einfach explizit an, wenn Sie mit Sellerie beginnen.Sie können auch einstellen
--loglevel=DEBUG
und Sie sollten das Problem wahrscheinlich sofort sehen.quelle
--loglevel=DEBUG
, es gab einen Syntaxfehler in meiner Aufgabe.celery worker
zB fürDjango
wie diesecelery --app=your_app.celery worker --loglevel=info
celery.registry.tasks
eine Liste aller meiner aktuellen Aufgaben anzeigen . Sie können jederzeit überprüfen, indem Sie ausführendir(celery.registry)
.--loglevel=DEBUG
von meiner SeiteIch denke, Sie müssen den Worker-Server neu starten. Ich treffe das gleiche Problem und löse es durch einen Neustart.
quelle
celery inspect registered
--autoreload
starten, mit der Sellerie jedes Mal neu gestartet wird, wenn der Code geändert wurde.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.py
Datei haben, muss diese beim Start des celeryd-Dienstes wie--settings=celery_settings.py
von digivampire beschrieben deklariert werden.quelle
Unabhängig davon, ob Sie
CELERY_IMPORTS
oder verwendenautodiscover_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 einedebug_task
Aufgabe in meinem habecelery.py
.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
,celeryconfig
oderconfig_from_object
.Wenn Sie Sellerie-Beat verwenden, stellen Sie sicher, dass der Aufgabenname
task
, den Sie verwenden,CELERYBEAT_SCHEDULE
mit dem Namen in der Sellerie-Aufgabenliste übereinstimmt.quelle
@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) }
Ich hatte auch das gleiche Problem; Ich fügte hinzu
in meiner
celeryconfig.py
Datei, um es zu lösen.quelle
CELERY_IMPORTS = ['my_module']
Bitte einschließen = ['proj.tasks'] Sie müssen in das oberste Verzeichnis gehen und dies dann ausführen
nicht
in Ihrer celeryconfig.py Eingabe imports = ("path.ptah.tasks",)
Bitte in einem anderen Modul Aufgabe aufrufen !!!!!!!!
quelle
include
Parameter muss hinzugefügt werden, wenn Sie relative Importe verwenden. Ich habe mein Problem durch Hinzufügen gelöstplease in other module invoke task!!!!!!!!
. Es half.Die Verwendung von --settings hat bei mir nicht funktioniert. Ich musste Folgendes verwenden, um alles zum Laufen zu bringen:
Hier ist die celeryconfig-Datei, der CELERY_IMPORTS hinzugefügt wurde:
Mein Setup war etwas kniffliger, da ich Supervisor verwende, um Sellerie als Daemon zu starten.
quelle
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.
quelle
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 meinecelery.py
von geändertzu
quelle
Was für mich funktionierte, war, dem Sellerie-Aufgabendekorateur einen expliziten Namen hinzuzufügen. Ich habe meine Aufgabenerklärung von
@app.tasks
auf geändert@app.tasks(name='module.submodule.task')
Hier ist ein Beispiel
quelle
Ich hatte das gleiche Problem beim Ausführen von Aufgaben von Celery Beat. Sellerie mag keine relativen Importe, daher
celeryconfig.py
musste ich in meinem explizit den vollständigen Paketnamen festlegen:quelle
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.quelle
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
quelle
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.
quelle
Wenn Sie die Apps-Konfiguration in installierten Apps wie folgt verwenden:
Importieren Sie dann in Ihrer Konfigurations-App die Aufgabe in der folgenden Bereitschaftsmethode:
quelle
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 .
quelle
Die Lösung für mich, diese Zeile zu / etc / default / celeryd hinzuzufügen
Denn wenn ich diese Befehle ausführe:
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.
quelle
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.
quelle
Nur um meine zwei Cent für meinen Fall mit diesem Fehler hinzuzufügen ...
Mein Weg ist
/vagrant/devops/test
mitapp.py
und__init__.py
darin.Wenn ich laufe,
cd /vagrant/devops/ && celery worker -A test.app.celery --loglevel=info
erhalte ich diesen Fehler.Aber wenn ich es laufen
cd /vagrant/devops/test && celery worker -A app.celery --loglevel=info
lasse, ist alles in Ordnung.quelle
Ich habe festgestellt, dass einer unserer Programmierer einem der Importe die folgende Zeile hinzugefügt hat:
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.
quelle
Sellerie unterstützt keine relativen Importe, daher benötigen Sie in meiner celeryconfig.py einen absoluten Import.
quelle
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.
quelle
Meine 2 Cent
Ich habe dies in einem Docker-Bild mit alpinen bekommen. Die Django-Einstellungen, auf die
/dev/log
fü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 Startsyslogd
gestartet, der für den Sellerie-Arbeiter jedoch nicht. Dies führte dazu, dass Dinge wie./manage.py shell
scheiterten, weil es keine gab/dev/log
. Der Sellerie-Arbeiter versagte nicht. Stattdessen ignorierte es stillschweigend nur den Rest des App-Starts, der das Laden vonshared_task
Einträgen aus Anwendungen im Django-Projekt beinhaltetequelle
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.
(Ich musste sudo verwenden, da die Dateien dem Root-Benutzer gehörten.)
Docker-Version: 18.03.1
quelle
Wenn Sie verwenden
autodiscover_tasks
, stellen Sie sicher, dass Ihrefunctions
zu registrierendetasks.py
Datei in der , nicht in einer anderen Datei bleibt . Oder Sellerie kann das, wasfunctions
Sie registrieren möchten, nicht finden .Verwendung
app.register_task
wird auch die Arbeit erledigen, scheint aber ein wenig naiv.Bitte beachten Sie diese offizielle Spezifikation von
autodiscover_tasks
.quelle
Schreiben Sie den richtigen Pfad zu den Dateiaufgaben
}}
quelle
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.
quelle
quelle
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.
quelle
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:
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.
quelle