Heim  >  Artikel  >  Backend-Entwicklung  >  Lernen Sie Python Celery und erledigen Sie problemlos asynchrone Aufgaben

Lernen Sie Python Celery und erledigen Sie problemlos asynchrone Aufgaben

WBOY
WBOYnach vorne
2023-04-23 15:31:161725Durchsuche

Obwohl moderne Webanwendungen schneller und komfortabler als je zuvor sind, gibt es immer noch viele Situationen, in denen schwere Aufgaben auf andere Teile des Systems verlagert werden müssen, anstatt am Haupt-Thread zu arbeiten.

Beispiele für diese Situationen sind wie folgt:

  • Periodische Aufgaben – Jobs, deren Ausführung in bestimmten Intervallen geplant ist. Zum Beispiel tägliche, monatliche Berichtserstellung.
  • Tools von Drittanbietern – Anwendungen sollten Antworten schnell an den Benutzer zurückgeben, anstatt darauf zu warten, dass andere Aufgaben zuerst abgeschlossen werden. Versenden Sie beispielsweise E-Mails und Benachrichtigungen und kommunizieren Sie den Update-Fortschritt an interne Tools.
  • Jobs mit langer Laufzeit – Jobs, die komplex oder ressourcenintensiv sind und bei denen der Benutzer warten muss, bis der Job abgeschlossen ist. Zum Beispiel. DAG-Workflows, Map-Reduce-basierte Aufgaben, lang laufende Spark-Jobs usw.

Wie geht man also mit diesen Situationen um? Zu diesem Zeitpunkt ist Sellerie praktisch.

Was ist Sellerie?

Celery ist eine Open-Source-Implementierung von Aufgabenwarteschlangen, die häufig mit Python-basierten Web-Frameworks wie Flask und Django kombiniert wird, um Aufgaben außerhalb des typischen Anforderungs-Antwort-Zyklus asynchron auszuführen.

Celery ist also im Wesentlichen eine Aufgabenwarteschlange, die auf verteiltem Messaging basiert. Ausführungseinheiten oder Aufgaben werden mithilfe von Multiprocessing, Gevent oder Eventlets gleichzeitig auf einem oder mehreren Workern ausgeführt. Diese Aufgaben können synchron (d. h. warten, bis sie bereit sind) oder asynchron (d. h. im Hintergrund) ausgeführt werden.

轻松完成异步任务,一文搞懂Python Celery

Wie wirkt Sellerie?

Celery ist eine verteilte Aufgabenwarteschlange, die auf dem Producer-Consumer-Modell basiert.

Task Queue ist ein Mechanismus zum Verteilen von Arbeit auf Threads und Maschinen, im Wesentlichen ein Nachrichtenvermittler zwischen Produzenten (Webanwendungen) und Konsumenten (Celery-Worker).

Sellerie interagiert über Nachrichten, wobei Makler als Vermittler zwischen Kunden (Produzenten) und Arbeitern (Konsumenten) fungieren. Um eine Aufgabe zu starten, schiebt der Client eine Nachricht in die Warteschlange und der Broker übermittelt die Nachricht an den Worker.

Das Celery-System kann aus mehreren Arbeitern und Maklern bestehen, was die Möglichkeit einer hohen Verfügbarkeit und horizontalen Erweiterung bietet.

Kurz gesagt ist der Celery-Client der Produzent, der über den Message Broker neue Aufgaben zur Warteschlange hinzufügt. Anschließend erhalten Celery-Mitarbeiter über den Nachrichtenbroker auch neue Aufgaben aus der Warteschlange. Nach der Verarbeitung werden die Ergebnisse im Ergebnis-Backend gespeichert.

Arbeitsbeispiel

Das folgende Beispiel verwendet RedisMQ als Nachrichtenbroker.

Redis einrichten

Führen Sie auf einem Linux/MacOS-System den Redis-Server lokal aus, indem Sie den folgenden Befehl ausführen:

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ rm redis-stable.tar.gz
$ cd redis-stable
$ make

Nach dem Einrichten von Redis führen Sie den Redis-Server aus, indem Sie den folgenden Befehl ausführen:

$ redis-server

Der Server läuft weiter der Standardport 6379.

Richten Sie die Anwendung ein

Richten Sie zunächst das Python-Projekt lokal ein.

Celery kann über Standardtools wie pip oder easy_install installiert werden. Installieren Sie Celery und Redis über den folgenden Befehl:

pip install celery redis==4.3.4

Jetzt benötigen Sie eine Celery-Instanz, um die Anwendung auszuführen. Jede von Celery implementierte Aufgabe beginnt mit einer Instanz, wie zum Beispiel das Erstellen und Verwalten von Aufgaben.

Erstellen Sie eine Datei task.py im Projekt:

From celery import Celery

broker_url = 'redi://localhost:6379/0'

app = Celery('tasks',broker = broker_url)

@app.task
def add(x, y):
return x+y

Hier wird eine einfache Aufgabe add() definiert, die die Summe zweier Zahlen zurückgibt.

Run Celery Worker

Wechseln Sie auf dem Terminal zum Projektspeicherort und führen Sie den Celery Worker mit dem folgenden Befehl aus:

$ celery -A tasks worker - loglevel=info

Für weitere Informationen zur Celery Worker-Befehlszeile können Sie Hilfe verwenden:

$ celery worker - help

Rufen Sie die Aufgabe auf

In Celery verwenden Sie die Methode „delay()“, um die Aufgabe aufzurufen.

Öffnen Sie ein weiteres Terminalfenster für Ihr Projekt und führen Sie den folgenden Befehl aus:

$ python

Dadurch wird die Python-Befehlszeile geöffnet.

>> from tasks import add
>> add.delay(1,2)

Dadurch wird eine AsyncResult-Instanz zurückgegeben, die verwendet werden kann, um den Status der Aufgabe zu überprüfen, ihren Rückgabewert abzurufen, auf den Abschluss der Aufgabe zu warten und auch Ausnahmen und Tracebacks bei Fehlern abzurufen.

Nachdem der Befehl add.delay() ausgeführt wurde, wird die Aufgabe in die Warteschlange verschoben und dann vom Worker übernommen. Dies kann am Celery-Worker-Terminal überprüft werden, wo Sie deutlich sehen können, dass die Aufgabe empfangen und später erfolgreich abgeschlossen wird.

Das obige ist der detaillierte Inhalt vonLernen Sie Python Celery und erledigen Sie problemlos asynchrone Aufgaben. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen