Einführung in Celery: Asynchrone Task-Queue für Python

Celery ist eine verteilte Aufgaben- oder Job-Queue, die auf asynchroner Nachrichtenübermittlung basiert. Sie ermöglicht es Python-Anwendungen, Hintergrundprozesse entweder sofort oder zu einem geplanten Zeitpunkt auszuführen. Je nach Bedarf kann Celery so konfiguriert werden, dass Aufgaben synchron oder asynchron abgearbeitet werden.

Das asynchrone Nachrichtenmodell sorgt dafür, dass Nachrichten zwischen Sender und Empfänger zwischengespeichert werden. Dadurch kann der Sender nach dem Senden fortfahren, während mehrere Nachrichten in der Warteschlange verbleiben, bis sie verarbeitet werden.

Hauptkomponenten von Celery

  • Aufgaben (Tasks)
  • Task-Broker
  • Result-Backend
  • Worker

Aufgaben sind einfache Python-Funktionen, die von Celery in Workern ausgeführt werden. Sie werden mit einem speziellen Decorator gekennzeichnet, um sie von regulären Funktionen zu unterscheiden.

Der Task-Broker ist das Kommunikationssystem zwischen deiner Anwendung und Celery. Er übernimmt die Übermittlung der Aufgaben zur Ausführung. Unterstützte Broker sind unter anderem Redis®, RabbitMQ und Amazon SQS.

Das Result-Backend dient zur Speicherung der Ergebnisse abgeschlossener Aufgaben. Celery kann diese Informationen anschließend abrufen. Unterstützt werden Backends wie Redis®, RabbitMQ (AMQP) oder SQLAlchemy.

Ein Worker ist ein Celery-Prozess, der dauerhaft im Hintergrund läuft und auf neue Aufgaben wartet. In der Regel werden mehrere Worker gleichzeitig betrieben, um parallele Ausführungen zu ermöglichen.

Lebenszyklus einer Aufgabe in Celery

Die Abarbeitung einer Aufgabe durch Celery erfolgt in drei Phasen:

  • Registrierung der Aufgabe
  • Ausführung der Aufgabe
  • Speicherung des Ergebnisses

Die Anwendung sendet eine Aufgabe an den Broker, dieser weist sie einem Worker zu, der sie ausführt. Nach Abschluss wird das Ergebnis im Result-Backend abgelegt.

Anwendungsbereiche von Celery

Celery lässt sich vielseitig einsetzen – abhängig vom Projekt und dessen Anforderungen. Die häufigsten Einsatzszenarien sind:

  • Periodische Ausführung – Aufgaben, die in festen Intervallen laufen, etwa das Versenden eines monatlichen Newsletters.
  • Drittanbieter-Integration – Aufgaben, die mit externen Diensten interagieren, z. B. das Versenden von E-Mails über SMTP.
  • Lange laufende Prozesse – Aufgaben, die viel Zeit beanspruchen, wie das Komprimieren oder Verarbeiten großer Dateien.

Erstellen deines ersten Celery-Programms

In diesem Abschnitt lernst du, wie du Celery-Aufgaben in ein einfaches Python-Programm integrierst.

Voraussetzungen

Um dieses Tutorial zu befolgen, benötigst du:

  • Python 3.7 oder höher
  • Einen installierten Redis®-Server

Installation von Celery

Celery wird über den Python-Paketmanager (pip) installiert.

Installiere die aktuelle Version von Celery:

Installiere zusätzlich die Abhängigkeiten für Redis®:

Erstellen deiner ersten Celery-Task

Hier siehst du ein einfaches Beispiel, wie du eine reguläre Python-Funktion in eine Celery-Task umwandelst.

Importiere und initialisiere das Celery-Objekt:

from celery import Celery

app = Celery(
    'tasks',
    broker="redis://localhost:6379/0",
    backend="redis://localhost:6379/0"
)

Wenn du eine angepasste Redis®-Konfiguration verwendest, passe den Verbindungsstring an:
redis://username:password@hostname:port/db

Erstelle eine einfache Celery-Aufgabe:

@app.task
def multiply(a, b):
    import time
    time.sleep(5)
    return a * b

Endgültiger Code für tasks.py:

from celery import Celery

app = Celery(
    'tasks',
    broker="redis://localhost:6379/0",
    backend="redis://localhost:6379/0"
)

@app.task
def multiply(a, b):
   import time
   time.sleep(5)
   return a * b

Verwalten von Celery-Workern

Worker sind Prozesse, die die von Celery in die Warteschlange eingestellten Aufgaben ausführen.

Starte einen Celery-Worker:

celery -A tasks worker -n worker1 -P prefork -l INFO

Erläuterung der Parameter:

  • -A: Gibt die Anwendung an.
  • -n: Vergibt einen Namen für den Worker.
  • -P: Bestimmt den Pool-Typ.
  • -l: Legt die Protokollstufe fest.

Um den Worker im Hintergrund auszuführen, füge das Flag -D hinzu.

Beende alle laufenden Celery-Worker:

ps auxww | awk '/celery(.*)worker/ {print $2}' | xargs kill -9

Ausführen von Tasks in Celery

Nachdem der Worker gestartet wurde, öffne eine Python-Konsole im selben Verzeichnis wie tasks.py.

Importiere und führe die Aufgabe aus:

from tasks import multiply
task1 = multiply.delay(512, 100)

Überprüfe den Status der Aufgabe:

Rufe das Ergebnis ab:

Arten von Celery-Workern

Die Wahl des richtigen Worker-Typs hat großen Einfluss auf Leistung und Effizienz.

  • Solo – Führt Aufgaben nacheinander aus.
  • Prefork – Nutzt mehrere Prozesse für parallele Aufgaben.
  • Eventlet – Verwendet Green Threads für I/O-lastige Aufgaben.
  • Gevent – Ähnlich wie Eventlet, ideal für netzwerkgebundene Prozesse.

Starte Worker mit Solo-Pool:

celery -A tasks worker --pool=solo --loglevel=info

Starte Worker mit Prefork-Pool:

celery -A tasks worker --pool=prefork --concurrency=4 --loglevel=info

Starte Worker mit Eventlet- oder Gevent-Pool:

celery -A tasks worker --pool=eventlet --concurrency=500 --loglevel=info
celery -A tasks worker --pool=gevent --concurrency=500 --loglevel=info

Hinweis: Installiere zusätzliche Abhängigkeiten für Eventlet oder Gevent separat:
pip install celery[eventlet] oder pip install celery[gevent]

Fazit

Mit diesem Leitfaden hast du gelernt, wie du Celery in Python-Anwendungen einbindest. Celery wird in vielen SaaS-Anwendungen als Hintergrundprozessor eingesetzt, um asynchrone Prozesse effizient und skalierbar auszuführen.

Quelle: vultr.com

Jetzt 200€ Guthaben sichern

Registrieren Sie sich jetzt in unserer ccloud³ und erhalten Sie 200€ Startguthaben für Ihr Projekt.

Das könnte Sie auch interessieren: