unabhängiger Thread mit Cherrypy starten

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 916
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Samstag 10. November 2007, 13:38

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. November 2007, 14:36

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 916
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Samstag 10. November 2007, 15:17

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. November 2007, 16:38

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
Damaskus
Administrator
Beiträge: 916
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Samstag 10. November 2007, 18:00

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
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 10. November 2007, 18:10

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
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

Samstag 10. November 2007, 18:17

Urks. Thread spawning in einer WSGI Anwendung. Das würde ich bleiben lassen da das Verhalten undefiniert ist.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
Damaskus
Administrator
Beiträge: 916
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Samstag 10. November 2007, 18:33

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
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Sonntag 11. November 2007, 13:50

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.
Antworten