Jan: CGI Threading

Hey,

ich habe Schwierigkeiten mit Threads und CGI.

Ausgangssituation:

Der User startet mehrere lange andauernde "Render" Funktion mit AJAX.

Das PERL-CGI Script prüft nun ob er berechtigt ist und gibt zurück ob der Render Vorgang erfolgreich gestartet wurde.

Problem:

Die Antwort kommt erst an nachdem das Rendern abgeschlossen wurde.

Ich habe nun versucht mit Threads dieses Problem zu lösen im etwa so:

  
  
#!/usr/bin/perl -w  
  
use CGI qw/:standard/;  
  
print header, start_html, p('RENDER VORGANG GESTARTET'), end_html;  
  
use Thread qw(yield async);  
async  
{  
  # lange rendern  
};  

Logischerweise funktioniert das nicht, da der Hauptprozess beendet wird.
Der User erhält zwar schnell eine Antwort allerdings wird der Render Prozess nicht ausgeführt:

A thread exited while 2 threads were running.

  1. Hey,

    Problem:

    Die Antwort kommt erst an nachdem das Rendern abgeschlossen wurde.

    Ein typischer Fall für Ajax.

    Ich habe nun versucht mit Threads dieses Problem zu lösen im etwa so:

    use Thread; ist ein Modul zur Ablaufverfolgug. Das ist wohl nicht dass, wass Du möchtest.

    Falls Deine mit ajax angetriggerten Prozesse sehr sehr lange dauern, wäre eine Möglichkeit, deren Ergebnisse temporär zu speichern, z.B. in einer DB und mit Sessions (cookie) zu arbeiten, damit der Benutzer später seine Ergebnisse abrufen kann und nicht die der Anderen.

    Hotti

    --
    Wenn der Kommentar nicht zum Code passt, kann auch der Code falsch sein.
    1. Hallo Hotti,

      vlt hast du es nicht ganz verstanden.
      Ich verwende bereits AJAX, aber die AJAX Antwort kommt erst nach Ende des Renderns, da dann erst der AJAX Prozess abgeschlossen ist.

      Gruß

  2. Hallo Jan,

    prinzipiell sehe ich, wie Rolf auch, dass use Thread vermutlich nicht das ist, was Du suchst.
    perlthrtut i. V. m. threads

    Grundsätzlich gehst Du IMHO fehl in der Annahme, threads können Dir in nur irgendeiner Weise helfen. Wie zu sehen ist wird Perl via CGI angesprochen. Somit kann es Dir bereits auf Seiten des Webservers passieren, ob mit threads oder ohne ist dabei irrelevant, dass die Ausgabe 'RENDER VORGANG GESTARTET' erstmal im Ausgabepuffer hängt, statt gleich an den HTTP-Client durchgereicht zu werden. Weiterhin hast Du noch das Problem, dass es XMLHttpRequest.responseText nur -am Stück- gibt. Das wiederum aber heißt nicht mehr als dass Deine Überlegungen, Perl-Routinen zu zerlegen, um Vorabmeldungen zu generieren, in der Funktionsweise von Browsern ihr Ende finden.

    Verschiebe also das ganze auf die Browserseite:

    if (typeof XMLHttpRequest != 'undefined') {  
        xmlHttp = new XMLHttpRequest();  
    }  
    if (!xmlHttp) {  
        // Internet Explorer 6 und älter  
        try {  
            xmlHttp  = new ActiveXObject("Msxml2.XMLHTTP");  
        } catch(e) {  
            try {  
                xmlHttp  = new ActiveXObject("Microsoft.XMLHTTP");  
            } catch(e) {  
                xmlHttp  = null;  
            }  
        }  
    }  
    if (xmlHttp) {  
        xmlHttp.open('GET', 'beispiel.xml', true);  
        xmlHttp.onreadystatechange = function () {  
            if (xmlHttp.readyState == 2) {  
                alert('RENDER VORGANG GESTARTET');  
            }  
            if (xmlHttp.readyState == 4) {  
               do_content(xmlHttp.responseText);  
            }  
        };  
        xmlHttp.send(null);  
    }
    

    Jedoch wird Dir das auch dann nicht viel nutzen, wenn der Webserver die Response-Header erst mit der Ressource durch die Leitung jagt, also wenn Das Perl-Script gänzlich abgearbeitet wurde. Da verhalten sich verschiedene Server unterschiedlich.

    Gruß aus Berlin!
    eddi

    --
    Ach übrigens: X für'n U verkürzt Strecken nur scheinbar!