Ich habe ein Problem mit dem Aufruf von subprocess.Popen aus einer Ansicht: Die Ansicht, die subprocess.Popen aufruft, wird nicht angezeigt, bis der Subprozess beendet ist. Der Server sendet sofort "200 OK", aber nicht den Inhalt der Seite.
Meine Frage ist: Ist dies eine Einschränkung von Djangos Entwicklungsserver oder mache ich es falsch?
Der Server bleibt nicht vollständig hängen, da in der Zwischenzeit andere Ansichten bearbeitet werden können.
Es gibt bereits ein paar Fragen zu diesem Thema und Google gibt ein paar andere Themen aber ich kann keine klare Antwort auf meine Frage finden.
Ich glaube nicht, dass dies ein Python-Problem ist, da diese Befehle sofort beendet werden:
python -c 'import subprocess; print subprocess.Popen(["/bin/sleep", "10"]).pid'
Wie man sich vervielfältigt
Testprojekt und Anwendung erstellen:
cd /tmp
django-admin.py startproject django_test
cd django_test
./manage.py startapp subprocess_test
Ersetzen Sie urls.py & subprocess_test/views.py durch:
-
urls.p
from django.conf.urls.defaults import *
urlpatterns = patterns('',
(r'^hello$', 'subprocess_test.views.hello'),
(r'^start$', 'subprocess_test.views.start'),
) -
subprocess_test/views.py
from django.http import HttpResponse
importieren subprocess
def hallo(Anfrage):
return HttpResponse('Hallo Welt!')def start(Anfrage):
subprocess.Popen(["/bin/sleep", "10"])
return HttpResponse('start done')
Testen Sie es:
./manage.py runserver 0.0.0.0:8000
Aller à http://127.0.0.1:8000/hello et http://127.0.0.1:8000/start
Testergebnis
"start" braucht 10s zum Laden und "hello" kann während dieser Zeit geladen werden. Ich erhalte zum Beispiel ein solches Protokoll:
[01/Feb/2011 07:20:57] "GET /hello HTTP/1.1" 200 12
[01/Feb/2011 07:21:01] "GET /start HTTP/1.1" 200 10
[01/Feb/2011 07:21:01] "GET /hello HTTP/1.1" 200 12
[01/Feb/2011 07:21:02] "GET /hello HTTP/1.1" 200 12
Mit wget:
wget http://127.0.0.1:8000/start
--2011-02-01 14:31:11-- http://127.0.0.1:8000/start
Verbindung zu 127.0.0.1:8000... hergestellt.
HTTP-Anfrage gesendet, erwarte Antwort... 200 OK
Länge: nicht spezifiziert [text/html]
Speichern in: `Start'[ <=> ] 10 --.-K/s in 9,5s
2011-02-01 14:31:21 (1,05 B/s) - " start " gespeichert [10]