Seite 1 von 1

unabhängiger Thread mit Cherrypy starten

Verfasst: Samstag 10. November 2007, 13:38
von Damaskus
Wie löse ich am besten folgende beide Probleme mit Cherrypy

1. Daten die über ein Formular eingegeben wurden sollen in einem separatem Thread verarbeitet werden ohne das die Formular Klasse auf den Thread wartet. Die verarbeitung dauert ca. 25 Sekunden und solange möchte ich den User nicht warten lassen.

2. Ich suche eine möglichkeit eine Klasse für bis zu 60 Minuten schlafen zu lassen. Gibt es dazu was eleganteres als time.sleep()?
Evtl. einen selbstständigen Thread der als Cronjob arbeitet ...

Gruß
Damaskus

Re: unabhängiger Thread mit Cherrypy starten

Verfasst: Samstag 10. November 2007, 14:36
von gerold
Hallo Damaskus!
Damaskus hat geschrieben:1. Daten die über ein Formular eingegeben wurden sollen in einem separatem Thread verarbeitet werden ohne das die Formular Klasse auf den Thread wartet.
Du könntest so etwas über AJAX lösen. Beim Übergeben der Anfrage vom Browser an den Server kannst du eine Funktion definieren die lokal im Browser ausgeführt wird, sobald eine Antwort vom Server zurück kommt. So könntest du sogar im Browser eine Meldung (z.B. in keiner Box) anzeigen, dass die Anfrage soeben bearbeitet wird.
Damaskus hat geschrieben:2. Ich suche eine möglichkeit eine Klasse für bis zu 60 Minuten schlafen zu lassen. Gibt es dazu was eleganteres als time.sleep()?
Wenn du aus einer Funktion erst nach 60 Min. zurückkehren möchtest, dann ist ``time.sleep()`` keine so schlechte Wahl, so lange die Funktion in einem eigenen Thread läuft um das Programm nicht zu blockieren.

Wenn du aber einfach alle 60 Min. eine Aktion ausführen möchtest, dann könntest du ``Threading.Timer`` dafür verwenden.

lg
Gerold
:-)

Verfasst: Samstag 10. November 2007, 15:17
von Damaskus
Hallo Gerold,
genau das ist nicht gewünscht.
Die gesamte verarbeitung muss auf dem Server geschehen und es soll keine Rückmeldung an den Browser erfolgen.

Für Problem 2 werde ich dann doch time.sleep verwenden. Die Zeiten sind variabel und werden nicht immer benötigt.

Gruß
Damaskus

Verfasst: Samstag 10. November 2007, 16:38
von gerold
Damaskus hat geschrieben:Die gesamte verarbeitung muss auf dem Server geschehen und es soll keine Rückmeldung an den Browser erfolgen.
Hallo Damaskus!

Du kannst ``thread.start_new_thread()`` verwenden, um eine zusätzliche Funktion in einem neuen Thread aufzurufen. Diese wird dann im Hintergrund abgearbeitet. Die Funktion in der ``thread.start_new_thread()`` aufgerufen wurde, wird normal fortgesetzt.

lg
Gerold
:-)

Verfasst: Samstag 10. November 2007, 18:00
von Damaskus
gerold hat geschrieben:
Damaskus hat geschrieben:Die gesamte verarbeitung muss auf dem Server geschehen und es soll keine Rückmeldung an den Browser erfolgen.
Hallo Damaskus!

Du kannst ``thread.start_new_thread()`` verwenden, um eine zusätzliche Funktion in einem neuen Thread aufzurufen. Diese wird dann im Hintergrund abgearbeitet. Die Funktion in der ``thread.start_new_thread()`` aufgerufen wurde, wird normal fortgesetzt.

lg
Gerold
:-)
Cherrypy bietet dafür nichts eigenes, oder?

Danke.

Gruß
Damaskus

Verfasst: Samstag 10. November 2007, 18:10
von gerold
Damaskus hat geschrieben:
gerold hat geschrieben:``thread.start_new_thread()``
Cherrypy bietet dafür nichts eigenes, oder?
Hallo Damaskus!

:wink:
``import this`` hat geschrieben:There should be one-- and preferably only one --obvious way to do it.
lg
Gerold
:-)

Verfasst: Samstag 10. November 2007, 18:17
von mitsuhiko
Urks. Thread spawning in einer WSGI Anwendung. Das würde ich bleiben lassen da das Verhalten undefiniert ist.

Verfasst: Samstag 10. November 2007, 18:33
von Damaskus
gerold hat geschrieben:
``import this`` hat geschrieben:There should be one-- and preferably only one --obvious way to do it.
Ok, ich habs verstanden. Danke :wink:
mitsuhiko hat geschrieben:Urks. Thread spawning in einer WSGI Anwendung. Das würde ich bleiben lassen da das Verhalten undefiniert ist.
Alternative? Ansonsten werd ich halt doch mal Thread spawning ausprobieren :wink:

Gruß
Damaskus

Verfasst: Sonntag 11. November 2007, 13:50
von Y0Gi
Vor kurzem habe ich auch in einer WSGI-Anwendung einen Thread eingeführt, um parallel Daten zu sammeln. Dieser wird allerdings nicht direkt aus der Anwendung heraus gestartet, sondern vor dem eigentlichen Vorbereiten und Starten dieser.

Das funktioniert nur solange sinnvoll, wie sichergestellt ist, dass der Thread auch nur einmal gestartet wird (die WSGI-Applikation selbst kann dagegen mehrere Threads nutzen). Das haut in manchen Deployment-Umgebungen aber nicht immer hin, von daher wird der Thread nun als separates Programm ausgelagert.

Möglicherweise kommt es für dich auch in Frage, dass du unabhängig von der WSGI-Applikation den (oder besser die)Thread(s) zur zeitintensiven Formularverarbeitung als externes Programm implementierst.