3 Stimmen

Warum erfordern meine Unterprozessaufrufe ein Neuladen der Seite, um ausgeführt zu werden?

Ich habe zwei separate subprocess Aufrufe in einer Django-App, jeder in einer anderen Ansicht. Der erste ruft das Bildkonvertierungstool dcraw auf, um ein hochgeladenes Rohbild in ein Tiff-Format zu konvertieren. (Die .tiff-Ausgabe ist in der Regel neunmal größer als die Eingabe, z. B. ergibt ein 8 MB großes Bild eine 72 MB große tiff-Datei).

pdcraw = subprocess.Popen(dcraw_args, stdout=None, stderr=None)
pdcraw.communicate()

Mein zweiter Unterprozess ruft ein Matlab-Skript auf, das die Tiff-Datei verarbeitet und die entsprechenden Dateien und Bilder ausgibt. Dieser Aufruf dauert normalerweise gut 15-20 Sekunden, wenn ich das Skript selbst ausführe.

result = subprocess.Popen(matlab_args, stdout=None, stderr=None)
result.communicate()

Mein Problem: Bei beiden dieser Unterprozessaufrufe muss ich die Ansicht manuell neu laden, damit sie tatsächlich ausgeführt werden. Der Rest des Codes "um" sie läuft gut. Haben Sie eine Idee, wie ich dies vermeiden kann? Ich frage mich, ob es eine Art von Cache-Problem ist, da ich in der Lage gewesen bin, den ersten Subprozess ein paar Mal laufen zu lassen, bevor er ein Neuladen erfordert. Ich bin Ihnen für Ihre Hilfe sehr dankbar! Ich danke Ihnen im Voraus.

Dinge, die ich ausprobiert habe:

  • Einfügen time.sleep um die Teilprozesse herum, weil ich denke, dass es vielleicht zu kurz ist. Funktioniert aber nicht.
  • Verwendung von Rohren anstelle von None pour stdout . Ich denke, ich sollte die None da ich die Ergebnisse des Befehls nicht lesen muss (sie geben nur Bilder in ein in den Args angegebenes Verzeichnis aus).
  • Er verflucht sie. Noch in Arbeit.

0voto

Remi Punkte 19243

Weil die ganze Idee eines Unterprozesses ist asynchron, es wird nicht bereit sein, wenn Ihre Ansicht an den Browser geparst wird.

Vielleicht stellen Sie eine Ajax-Anfrage, um den Status des Fortschritts zu überprüfen, und sobald die Dateien verfügbar sind, können sie vom Server gesendet werden.

Oder Sie arbeiten mit WebSockets, die beliebige Daten senden können, sobald sie verfügbar sind, so dass keine zusätzlichen Anfragen erforderlich sind und eine superschnelle Antwort garantiert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X