Celery ist ein leistungsstarkes Framework, das die asynchrone Verarbeitung von Aufgaben unterstützt. Der @shared_task
-Dekorator wird verwendet, um Aufgaben (Tasks) zu definieren, und die Optionen bind
, autoretry_for
, retry_backoff
und max_retries
können die Stabilität der Aufgaben und die automatisierte Fehlerbehandlung erheblich verbessern.
In diesem Artikel werden wir die Funktionsweise jeder Option und deren Anwendung untersuchen sowie häufige Verwirrungen klären und die besten Lösungsansätze vorstellen.
1. bind=True
Definition
bind=True
ermöglicht es, die aktuelle Aufgabe (Task) als ersten Parameter zu übergeben, wodurch self
innerhalb der Aufgabe verwendet werden kann. Dadurch können Sie auf den Status, die Methoden und die Eigenschaften der Aufgabe zugreifen.
Hauptfunktionen
- Zugriff auf den Aufgabenstatus: Sie können auf die Aufgaben-ID, die Anforderungsinformationen usw. zugreifen, um den Status zu überprüfen oder Protokolle zu erstellen.
- Explizite Wiederholungslogik:
Mit der
self.retry()
-Methode können Sie die Wiederholungslogik manuell implementieren.
Beispiel
@shared_task(bind=True)
def my_task(self, some_arg):
print(f"Task-ID: {self.request.id}") # Task-ID ausgeben
self.retry() # Aufgabe wiederholen
2. autoretry_for=(ExceptionType, ...)
Definition
Legt fest, dass Celery die Aufgabe automatisch wiederholt, wenn die angegebene Ausnahme auftritt. Der Entwickler muss self.retry()
nicht explizit aufrufen, um die Ausnahme zu behandeln und die Wiederholung zu automatisieren.
Hinweise
- Bei Verwendung von
autoretry_for
: Da die Wiederholung automatisch erfolgt, darfself.retry()
nicht redundant verwendet werden. - Probleme bei Mischverwendung:
Wenn
autoretry_for
undself.retry()
gleichzeitig verwendet werden, kann es zu wiederholten Wiederholungen für dieselbe Ausnahme kommen.
Beispiel
Empfohlene Methode: Nur autoretry_for
verwenden
import requests
@shared_task(bind=True, autoretry_for=(requests.RequestException,), retry_backoff=True)
def my_task(self, url):
response = requests.get(url)
response.raise_for_status() # Auslösen einer Ausnahme, falls der Statuscode nicht 200 ist
Verwendung von expliziten Wiederholungen (self.retry()
) nur unter bestimmten Bedingungen
import requests
@shared_task(bind=True, retry_backoff=True, max_retries=5)
def my_task(self, url):
try:
response = requests.get(url)
response.raise_for_status()
except requests.RequestException as e:
print(f"Wiederhole aufgrund des Fehlers: {e}")
self.retry(exc=e) # Explizite Wiederholung
3. retry_backoff=True
Definition
Aktiviert eine exponentielle Rückoff (Exponential Backoff), die die Intervalle zwischen den Wiederholungen allmählich erhöht. Die erste Wiederholung erfolgt sofort, danach steigen die Abstände auf 1 Sekunde, 2 Sekunden, 4 Sekunden usw.
Hauptfunktionen
- Reduziert die Serverlast und behandelt Netzwerkprobleme effizient.
- Die Rückoff-Zeiten können über Celerys Standardeinstellungen angepasst werden.
Beispiel
@shared_task(bind=True, autoretry_for=(requests.RequestException,), retry_backoff=True)
def my_task(self):
# Erste Wiederholung nach 1 Sekunde, zweite nach 2 Sekunden...
raise requests.RequestException("Simulierte Fehlermeldung")
4. max_retries
Definition
Begrenzt die maximale Anzahl der Wiederholungen für die Aufgabe. Wenn die Aufgabe nach der angegebenen Anzahl von Wiederholungen nicht erfolgreich ist, wird sie als fehlgeschlagen markiert.
Hauptfunktionen
- Verhindert unendliche Wiederholungen und begrenzt den Ressourcenverbrauch des Servers.
- Ermöglicht das Protokollieren von Aufgaben oder das Ausführen anderer Logik basierend auf Fehlbedingungen.
Beispiel
@shared_task(bind=True, autoretry_for=(requests.RequestException,), retry_backoff=True, max_retries=5)
def my_task(self):
raise requests.RequestException("Simulierte Fehlermeldung")
5. Hinweise zur Mischverwendung: autoretry_for
vs self.retry()
Richtige Verwendungshinweise
- Bei Verwendung von
autoretry_for
: Da die automatische Wiederholung aktiviert ist, müssen Sieself.retry()
nicht explizit aufrufen. Sie können einfachen Code schreiben, um die Aufgabe für bestimmte Ausnahmen zu wiederholen. - Bei Verwendung von
self.retry()
: Dies wird verwendet, wenn vor der Wiederholung zusätzliche Aktionen (z. B. Protokollierung, Überprüfung bestimmter Bedingungen) erforderlich sind. Achten Sie darauf, keine Redundanz mitautoretry_for
zu schaffen.
6. Zusammenfassung der Optionen
Option | Beschreibung |
---|---|
bind=True |
Ermöglicht den Zugriff auf den Aufgabenstatus und Methoden über self . |
autoretry_for |
Automatische Wiederholung der Aufgabe, wenn bestimmte Ausnahmen auftreten. |
retry_backoff |
Aktivierung des exponentiellen Rückoffs, der die Intervalle zwischen den Wiederholungen erhöht. |
max_retries |
Begrenzung der maximalen Anzahl der Wiederholungen zur Definition von Bedingungen für den Misserfolg der Aufgabe. |

7. Fazit
Die Optionen von Celerys @shared_task
sind nützlich, um Aufgabenfehlfunktionen effektiv zu behandeln und die Stabilität zu erhöhen.
- Bei Verwendung von
autoretry_for
: Achten Sie darauf, dass die Wiederholungslogik automatisiert ist, sodass sie nicht mitself.retry()
in Konflikt steht. - Wenn bedingte Logik oder zusätzliche Aktionen erforderlich sind, können
self.retry()
verwendet werden.
Um Aufgaben mit Celery stabil umzusetzen, sollten Sie diese Optionen kombinieren und optimierten Code für die jeweilige Situation schreiben! 😊
Add a New Comment