Wie kann ich eine periodische Sellerie-Aufgabe manuell über die Shell ausführen?

77

Ich benutze Sellerie und Django-Sellerie. Ich habe eine regelmäßige Aufgabe definiert, die ich testen möchte. Ist es möglich, die periodische Aufgabe manuell über die Shell auszuführen, damit ich die Konsolenausgabe anzeigen kann?

Mridang Agarwalla
quelle

Antworten:

108

Haben Sie versucht, die Aufgabe nur über die Django-Shell auszuführen? Mit der .applyMethode einer Aufgabe können Sie sicherstellen, dass sie eifrig und lokal ausgeführt wird.

Angenommen, die Aufgabe wird my_taskin der Django-App myappin einem tasksSubmodul aufgerufen :

$ python manage.py shell
>>> from myapp.tasks import my_task
>>> eager_result = my_task.apply()

Die Ergebnisinstanz hat dieselbe API wie der übliche AsyncResultTyp, außer dass das Ergebnis immer eifrig und lokal ausgewertet wird und die .apply()Methode blockiert wird, bis die Aufgabe vollständig ausgeführt wird.

Platinum Azure
quelle
Wie kann ich dasselbe für ein Pyramidenprojekt tun? Die Verzeichnisstruktur lautet wie folgt: / myproject => celeryconfig.py, setup.py, development.py, / views / celerytasks => mycelerytask.py. Jetzt möchte ich hier 'mycelerytask.py' ausführen (eine periodische Aufgabe). manuell von der Kommandozeile. Kannst du helfen?
Workonphp
@Workonphp Ich bin mit Pyramid leider nicht vertraut, daher weiß ich nicht, wie sich Sellerie überhaupt in Pyramid integriert. (Beachten Sie, dass meine obige Lösung Django-spezifisch ist und das manage.pySkript erfordert, das Django in allen Django-Projektverzeichnissen generiert.) Entschuldigung.
Platinum Azure
19

Wenn Sie damit meinen, dass Sie nur eine Aufgabe auslösen, wenn die Bedingung nicht erfüllt ist, z. B. die periodische Zeit nicht erfüllt. Sie können dies in zwei Schritten tun.

1. Holen Sie sich Ihre Aufgaben-ID.

Sie können dies durch Eingabe tun.

celery inspect registered

Sie werden so etwas sehen app.tasks.update_something. Wenn nichts, ist es wahrscheinlich, dass celerynicht gestartet wurde. Lass es einfach laufen.

2. Führen Sie die Aufgabe mit aus celery call

celery call app.tasks.update_something

Für weitere Details geben Sie einfach ein

celery --help
celery inspect --help
celery call --help
W.Perrin
quelle
2
Es unterstützt auch args und kwargs $ cellery -A yourapp call app.tasks.update_something --kwargs = '{"key": value, ...}
AlonS
1
Dies ist sehr hilfreich, aber am Ende fehlt eine Klammer. Korrigiert:celery -A yourapp call app.tasks.update_something --kwargs='{"key": value,...}'
Erik Kalkoken
Obwohl inspectes großartig ist, ist es leider nur für "RabbitMQ (AMQP) - und Redis-Transporte" verfügbar. (nicht andere wie filesystemzum Beispiel)
Rahman
7

Ich denke, Sie müssen zwei Shells öffnen: eine zum Ausführen von Aufgaben aus der Python / Django-Shell und eine zum Ausführen von celery worker( python manage.py celery worker). Und wie in der vorherigen Antwort angegeben, können Sie Aufgaben mit apply()oder ausführenapply_async()

Ich habe die Antwort so bearbeitet, dass Sie keinen veralteten Befehl verwenden.

Darkphoenix
quelle
3
manage.py celeryd ist jetzt veraltet: stackoverflow.com/a/23921568/1459594
rschwieb