Wie führe ich einen lang Laufenden job in den hintergrund, in Python
Ich habe eine web-service läuft, dass Aufträge mit langer Laufzeit (in der Größenordnung von mehreren Stunden). Ich bin der Entwicklung dieses über-Kolben, Gunicorn und nginx.
Was ich denke tun zu haben, die route, die dauert eine lange Zeit zu vollenden, eine Funktion aufzurufen, die einen thread erstellt. Die Funktion wird dann wieder eine guid zurück auf die Strecke, und die Strecke zurück eine url (mithilfe der guid), die der Benutzer verwenden können, um den Fortschritt zu überprüfen. Ich mache den thread ein daemon-thread.daemon = True), so dass der thread beendet wird, wenn meine Berufung code beendet (unerwartet).
Ist das der richtige Ansatz? Es funktioniert, aber das bedeutet nicht, dass es korrekt ist.
my_thread = threading.Thread(target=self._run_audit, args=())
my_thread.daemon = True
my_thread.start()
Du musst angemeldet sein, um einen Kommentar abzugeben.
Desto regelmäßiger Ansatz weiter zu behandeln, Frage ist, extrahieren Sie die Aktion aus der Basis-Anwendung und rufen Sie außerhalb, mit einem task-manager-system wie Sellerie.
Mit diese tutorial erstellen Sie Ihre Aufgabe und lösen Sie es von Ihrer web-Anwendung.
Dann können Sie ausführen:
Nur daran erinnern, die Sie ausführen müssen, um den Arbeiter getrennt:
Sellerie und RQ ist overengineering für einfache Aufgabe.
Werfen Sie einen Blick auf das docs - https://docs.python.org/3/library/concurrent.futures.html
Überprüfen Sie auch Beispiel, wie man lang laufende jobs im hintergrund für Kolben-app - https://stackoverflow.com/a/39008301/5569578
Gut, Obwohl dein Ansatz ist nicht falsch, im Grunde kann es führen Sie Ihr Programm ausführen lassen, aus den vorhandenen threads. Als Ali erwähnt, einen Allgemeinen Ansatz ist die Verwendung von Job-Queues wie
RQ
oderCelery
. Aber Sie brauchen nicht zu extrahieren-Funktionen, die zur Nutzung solcher Bibliotheken. Für Fläschchen, empfehle ich Ihnen,Kolben-RQ. Es ist einfach zu starten:RQ
Nur daran denken, Redis installieren, bevor Sie es in Ihrem Kolben-app.
Und dann einfach mit @Job Dekorateur in Ihrem Kolben Funktionen:
Und schließlich müssen Sie
rqworker
beginnen die Arbeiter:Können Sie sehen, RQ docs für mehr info. RQ wurde für einfache, lange laufende Prozesse.
Sellerie
Sellerie ist komplizierter, hat die riesige Liste der Funktionen und wird nicht empfohlen, wenn Sie ein neues job-Warteschlangen und die verteilte Verarbeitung Methoden.
Greenlets
Greenlets Schalter. Lassen Sie zum Umschalten zwischen lang Laufenden Prozessen.
Sie können greenlets für laufende Prozesse. Der Vorteil ist, Sie brauchen nicht, Redis und andere Arbeiter, anstatt Sie zu re-designen Sie Ihre Funktionen kompatibel zu sein:
Dein Ansatz ist gut, und wird völlig daran arbeiten, aber warum neu erfinden hintergrund Arbeiter für python web-Anwendungen, wenn eine allgemein akzeptierte Lösung existiert, nämlich Sellerie.
Ich brauchen würde, um zu sehen, eine Menge von tests vor, ich vertraute jedem Hause gerollt-code für solch eine wichtige Aufgabe.
Plus Sellerie gibt Ihnen Funktionen wie die Aufgabe, die Persistenz und die Fähigkeit zum verteilen von Arbeitnehmern, die über mehrere Maschinen.