Web Interface, Bottle + Celery ?

Django, Flask, Bottle, WSGI, CGI…
Antworten
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Ich muss ein Webinterface zu einem Webservice bauen, sprich man soll die Funktionen des Webservices über ein Webinterface bedienen können.

Erste überlegung war, einfach ein kleines Interface mit bottle.

Dann kam ich drauf das manche calls bis zu 30 minuten dauern können um fertig zu werden.

Ich brauche also ansych tasks, was bottle ja von Haus aus nich unterstützt.

Ich überlege jetzt einfach celery in bottle zu verwenden um tasks zu shedulen und das Ergebnis dann zu holen wenn's halt da ist.

Mein ihr das ist ne gute Idee oder hat vlt. jemand andere Vorschläge/Erfahrungen ?
Benutzeravatar
noisefloor
User
Beiträge: 3853
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

HTTP-Verbindungen sind ja "stateless", d.h. wenn alle Daten vom Server zum Client übertragen sind, sind beide erst Mal "fertig". Wenn ein Ergebnis auf dem Server auftritt, dann bekommt der Client nix mit. D.h. du musst IMHO erst Mal client-seitig was schreiben (per Javascript), was immer wieder beim Server anfragt, ob das Ergebnis eingetreten ist. Wenn ja kannst du die Daten / was auch immer abrufen.

Wobei du IMHO noch ein andere Problem hast: wenn das Eintreten eines Ergebnisses bis zu 30 min dauern kann, dann kannst (darfst) du IMHO nicht davon ausgehen, dass der Mensch, der vor dem Client sitzt, 30 min auf das offene Browser-Tab starrt und wartet, dass was passiert. Im ungünstigsten Fall schließt der Benutzer den Client. D.h. du solltest zusätzlich vielleicht client-seitig auch noch "Daten hinterlegen" (z.B. ein Cookie?), mit deren Hilfe man einen Client einem Webservice-Aufruf (und damit auch einem Ereignis aus als Ergebnis des Aufrufs) eindeutig zuordnen kann.

Gruß, noisefloor
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Danke für deine Antwort.
Schon klar das ich Clientseitig nachfragen muss, ich werd einfach JQuery nutzen bzw eine DB updaten mit dem Status des Tasks.
Das mit den Cookies ist ein guter Hinweis, zum Glück scheint das bei Bottle aber recht einfach zu gehen.

Die Frage die offen bleibt ist ob celery dafür am besten geeignet ist, oder ob ich einfach threads oder processe starte. Der Vorteil von Celery ist halt das es greenlets startet und das man die Tasks sehr schön überwachen kann (was ich so lese, hab da keine Erfahrung).
BlackJack

@patmaster: Wenn Du das ganze allgemein verwendbar als WSGI-Anwendung schreiben willst, dann musst Du die länger laufenden Prozesse in einem separaten Server/Daemon/System laufen lassen, oder zumindest die Daten für den Zugriff darauf persistent speichern. WSGI bietet zwar den Vorteil, dass die Webanwendung längerfristig laufen *kann* und nicht für jede Anfrage komplett neu gestartet werden muss, aber es bietet auf der anderen Seite weder die Garantie, dass die Webanwendung „ewig” läuft, noch dass davon nur ein Exemplar läuft das jede Anfrage beantwortet. Es gibt also keinen verlässlichen Zustand über Anfragen hinweg, es sei denn man sichert den extern, zum Beispiel in einer Datenbank.

Wenn Du Celery verwenden kannst und das magst, und auf der anderen Seite so etwas nachprogrammieren müsstest, dann solltest Du es auch verwenden. IMHO.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Danke für den Input, ich werde dann wohl Celery, oder eine der Alternativen verwenden.
Hast natürlich recht wenn du sagst das man nichts selber bauen sollte was es schon gibt, wenn es nicht unbedingt sein muss. Meine Bedenken drehen sich da immer um die Kompatibilität zwischen dein einzelnen libs vor allem wenn Webserver ins Spiel kommen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Naja, Celery ist schon mit genau sowas im Hinterkopf entwickelt worden und ich sehe da auch kein Problem. Kann man also problemlos mal ausprobieren.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Es gibt derzeit wohl Probleme mit Celery in Verbindung mit Windows. Nachdem ich gebunden wird, werd ich mir vermutlich mal APScheduler ansehen.
Antworten