web-dev-qa-db-de.com

Wie führe ich einen Hintergrundjob in Flask ohne Threading oder Task-Queue aus?

Ich baue REST API mit Flask-restplus. Einer meiner Endpunkte nimmt eine vom Client hochgeladene Datei und führt eine Analyse durch. Der Job dauert bis zu 30 Sekunden. Ich möchte nicht, dass der Job den Hauptprozess blockiert. Der Endpunkt gibt also sofort eine Antwort mit 200 oder 201 zurück. Der Job kann noch ausgeführt werden. Die Ergebnisse werden in einer Datenbank gespeichert, die später abgerufen wird.

Es scheint, dass ich zwei Optionen für lang andauernde Jobs habe. 

  1. Einfädeln
  2. Task-Warteschlange

Das Einfädeln ist relativ einfacher. Das Problem ist jedoch, dass die Anzahl der Threads für die Flask-App begrenzt ist. In einer eigenständigen Python-App konnte ich eine Warteschlange für die Threads verwenden. Dies ist jedoch REST api, jeder Anforderungsaufruf ist unabhängig. Ich weiß nicht, ob es eine Möglichkeit gibt, eine globale Warteschlange dafür zu erhalten. Wenn also die Anforderungen das Thread-Limit überschreiten, können nicht mehr Anforderungen angenommen werden.

Die Warteschlange mit Celery und Redis ist wahrscheinlich die bessere Option. Dies ist jedoch nur ein Beweis für das Konzept, und der Zeitplan ist ziemlich eng. Das Einrichten von Sellerie, Redis mit Flask ist nicht einfach. Ich habe sehr viel Probleme mit meinem Entwickler-Rechner, einem Windows. Es wird auf AWS bereitgestellt, was ziemlich komplex ist. 

Ich frage mich, ob es für diesen Fall eine dritte Option gibt?

5
ddd

Ich würde die Verwendung von Celery dringend empfehlen, wie Sie es bereits in Ihrem Beitrag erwähnt haben. Es ist genau für diesen Anwendungsfall gebaut. Ihre Dokumente sind wirklich informativ und es gibt keinen Mangel an Online-Beispielen, die Sie schnell zum Laufen bringen können.

Darüber hinaus würde ich sagen, dass THIS eine ausgezeichnete erste Ressource für Sie wäre.

4
Harrison

Sellerie ist eine fantastische Lösung für dieses Problem, das ich in der Vergangenheit bereits erfolgreich eingesetzt habe, um Millionen Jobs pro Tag zu verwalten.

Der einzige wirkliche Nachteil ist die anfängliche Lernkurve und die Komplexität des Debugging, wenn Dinge schief gehen (dies kann insbesondere bei Millionen von Jobs passieren).

Wenn Sie für eine gehostete Lösung offen sind, checken Sie aus Coherence-API sprachintegrierte verteilte Aufgaben

In voller Offenlegung handelt es sich um ein Produkt, das ich als Ersatz für Celery in meinen Projekten hergestellt habe. Der Einstieg ist relativ einfacher als bei Celery, und Sie müssen Ihre Worker- (oder Warteschlangen-) Infrastruktur nicht verwalten.

1
brthornbury