2010-11-22 10 views
2

Verwendung: Django mit PythonPython Thema nicht die Rückgabe des Werts

Geordnetes Ziel: eine Funktion aufrufen, die Video-Konvertierung verarbeitet (intern macht einen curl Befehl an den Server-Medien) und sollten sofort zurück an den Benutzer zurück.

Verwenden der Nachrichtenwarteschlange wäre ein Overkill für die App. So hatte ich beschlossen Threads zu verwenden, ich habe eine Klasse geschrieben, die die init und run-Methode überschreibt und rufen den curl Befehl

class process_video(Thread): 
    def __init__ (self,video_id,video_title,fileURI): 
     Thread.__init__(self) 
     self.video_id = video_id 
     self.video_title = video_title 
     self.fileURI = fileURI 
     self.status =-1 

    def run(self): 
     logging.debug("FileURi" + self.fileURI) 
     curlCmd = "curl --data-urlencode \"fileURI=%s\" %s/finalize"% (self.fileURI, settings.MEDIA_ROOT) 
     logging.debug("Command to be executed" + str(curlCmd)) 
     #p = subprocess.call(str(curlCmd), shell=True) 
     output_media_server,error = subprocess.Popen(curlCmd,stdout = subprocess.PIPE).communicate() 
     logging.debug("value returned from media server:") 
     logging.debug(output_media_server) 

Und ich instanziiert diese Klasse von einer anderen Funktion aufgerufen createVideo , die wie diese success = process_video(video_id, video_title, fileURI) nennen

Problem: Der Benutzer wird zurück zu der anderen Ansicht von der CreateVideo weitergeleitet und der ProcessVideo wird aufgerufen, aber aus irgendeinem Grund der erstellte Thread (Prozessvideo) nicht auf die Ausgabe vom Medienserver warten.

+0

Ich brauche ein paar weitere Informationen hier. Wie sieht der Code aus, der 'process_video' verwendet? Ich gehe davon aus, dass Sie etwas mehr tun, als nur eine Instanz von 'process_video' zu erstellen. – Arlaharen

+0

fügen Sie 'stderr = PIPE' hinzu und protokollieren Sie den' Fehler'. – jfs

+0

subprocess.Popen Aufruf scheint zu stecken, da es keinen Fehler oder keine Ausgabe zu protokollieren scheint. Ich habe auch die Protokolle des Medienservers überprüft und es werden keine Anrufe getätigt. Das Einrichten der Instanz von process_video als Daemon hilft auch nicht. Irgendwelche Ideen? –

Antwort

0

Ich würde nicht darauf verlassen, dass Threads in Web-Anwendungen korrekt ausgeführt werden. Abhängig vom MPM des Webservers kann der Prozess, der die Anfrage ausführt, nach einer Anfrage (vermutlich) beendet werden.

Ich würde empfehlen, die Medienserver-Anfrage synchron zu machen, aber lassen Sie den Medienserver sofort nach dem Start der Codierung ohne Probleme zurück (wenn Sie Kontrolle über seinen Quellcode haben). Dann könnte ein Hintergrundprozess (oder Cron) regelmäßig nach dem Ergebnis fragen. Dies ist nur eine Lösung - Sie sollten mehr Informationen über Ihre Infrastruktur bereitstellen (z. B. steuern Sie den Medienserver?).

Überprüfen Sie auch die Duplikate in den Kommentaren another question für einige Antworten über die Verwendung von Aufgabenwarteschlangen in einem solchen Szenario.

BTW Ich nehme an, dass keine Ausnahme im Hintergrund Thread ?!

0

Hier ist das, was ich getan habe, um das Problem zu umgehen, dem ich gegenüberstand.

Ich habe Django Kolben verwendet, um eine API für den Aufruf der Prozessvideo mit den Parametern als GET übergeben, bekam ich einen 403 CSRF Fehler, wenn ich versuchte, die Parameter als POST zu senden. und von der createVideo Funktion rief ich die API wie diese cmd = "curl \"% s/api/process_video /? Video_id =% s & fileURI =% s & video_title =% s \ ">/dev/null 2 > "% (settings.SITE_URL, str (video_id), urllib.quote (fileURI), urllib.quote (video_title))

und das funktionierte. Ich denke, es wäre hilfreich gewesen, wenn ich die Parameter session_id und post erhalten hätte. Ich bin mir nicht sicher, wie ich von der CSRF-Arbeit zur Arbeit kommen könnte.

Verwandte Themen