[Django] Subprocess / Neuen Prozess

Django, Flask, Bottle, WSGI, CGI…
Antworten
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Guten Morgen Forum,

ich würde gerne in einer Webanwendung ein externes Programm starten, dessen Abarbeitungszeit allerdings dauern könnte.

Nun war natürlich meine erster Gedanke: nimmste subprocess... allerdings bleibt dann natürlich die Antwort auf den Request aus, wenn man auf den Rückgabewert wartet bzw. stdout liest.

Ich würde aber schon gerne den gestarteten Prozess "unter Kontrolle" behalten, also schon gerne subprocess verwenden.

Mein Gedanke war: einfach mit subprocess ein weiteres script aufrufen, nicht auf dessen Rückgabe zu warten, und dieses script soll dann mit subprocess ein externes Programm aufrufen und ggf. eine Schnittstelle zur Verfügung stellen um Informationen über den Status des externe Programms zu liefern.
Die Frage ist nur: was passiert mit dem Prozess in der Webapplikation wenn Request durch ist, der subprozess natürlich noch läuft, und der Prozess der den Request behandelt hat eigentlich terminieren sollte?

Bin ich hier auf dem Holzweg? Ich müsste einen Prozess aufrufen (oder spawnen) der unabhängig von dem ganzen Aufruf ist.

Unter PHP müsste man dafür (AFAIK) irgend einen Wert in der php.ini setzen. Schiebt hier der Webserver auch einen Riegel vor oder ist die Überlegung sinnvoll?

Gruß
Sparrow


Edit: Also nur damit wir uns verstehen: im Development-Server von Django scheint das grundsätzlich zu funktionieren.
Wenn ich ein Python-Script schreibe das jede Sekunde piept dann piept das auch wirklich so lange bis ich den Development-Server beende, nachdem ich es in einem View per subprocess gestartet habe. Bis dahin kann aber brav weiter auf der Seite gesurft werden und alles ist gut.
Ich frage mich halt nur was passiert wenn zB ein Apache-Prozess einen Subprocess startet. Da habe ich noch keine Erfahrung mit.
deets

Deine anvisierte Mehrfach-subprocess-Kaskade ist nicht wirklich sinnvoll.

Grundsaetzlich passiert beim Start eines Unterprozesses im Apache erstmal nichts anderes als beim Django-Server. Allerdings gibt es ein Problem, das du mit dem Django-Server nicht hast: der Apache hat ja eine ganze Reihe von Worker-Prozessen. Und die sind unabhaengig voneinander. Das heisst, dass du ein in einem davon erzeugten subprocess.Popen-Objekt nicht in den anderen zugreifen kannst, um zB Rueckgabewerte oder Ausgaben zu erfassen.

Ob das ein Problem ist, kannst nur du selbst entscheiden. Wenn es fire&forget ist - dann mach einfach.

Wenn du aber eine ueber mehrere Requests gehende Kommunikation mit dem Unterprozess willst (weil du zB Fortschritte dokumentieren moechtest via Web), dann wuerde ich dir empfehlen, einen dezidierten Server zu bauen, der fuer dich deine Unterprozesse startet. ZB mittels des SimpleXMLRPCServer. Der laeuft dann auf deiner Maschine & hat ein Interface, auf das deine Webanwendung zugreift. Er startet die Popen-Instanzen, und managed die. Die Web-Prozesse bekommen eine ID zurueck, mittels derer sie auch spaeter den Zustand des Prozesses erfahren koennen. Dann musst du nur noch diese ID geeignet in deiner Webanwendung vorhalten. ZB als Session-Variable, oder irgendwie an den User gebunden via DB. Theoretisch auch per GET-Parameter, aber das wuerde Missbrauch Tuer & Tor oeffnen, *wenn* es keine Authorisierung gaebe - denn dann koennte jeder Prozesszustaende auch von anderen erfragen, und je nach Aufgabe ist das natuerlich ein Desaster.
Antworten