Muestre el resultado en la página web tan pronto como los datos estén disponibles en el servidor

Estoy escribiendo una página cgi en Python. Digamos que un cliente envía una solicitud a mi página cgi. Mi página cgi realiza el cálculo y, tan pronto como tiene la primera salida, envía esa salida al cliente, peroCONTINUAR Para hacer el cálculo y enviar otras respuestas.DESPUÉS Se envía la primera respuesta.

¿Es posible lo que he presentado aquí? Hago esta pregunta porque, en mi conocimiento limitado, en una página cgi, las respuestas se devuelven una vez básica, una vez que se envía una respuesta, cgi-page deja de ejecutarse. Esto se hace en el lado del servidor o del lado del cliente, y ¿cómo lo implemento?

Mi servidor está ejecutando Apache. Muchas gracias.

He intentado un código de cliente de "dbr" en este foro (gracias a él me dieron la idea de cómo funciona el sondeo largo).

<html>
<head>
    <title>BargePoller</title>
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript" charset="utf-8"></script>

    <style type="text/css" media="screen">
      body{ background:#000;color:#fff;font-size:.9em; }
      .msg{ background:#aaa;padding:.2em; border-bottom:1px #000 solid}
      .old{ background-color:#246499;}
      .new{ background-color:#3B9957;}
    .error{ background-color:#992E36;}
    </style>

    <script type="text/javascript" charset="utf-8">
    function addmsg(type, msg){
        /* Simple helper to add a div.
        type is the name of a CSS class (old/new/error).
        msg is the contents of the div */
        $("#messages").append(
            "<div class='msg "+ type +"'>"+ msg +"</div>"
        );
    }

    function waitForMsg(){
        /* This requests the url "msgsrv.php"
        When it complete (or errors)*/
        $.ajax({
            type: "GET",
            url: "msgsrv.php",

            async: true, /* If set to non-async, browser shows page as "Loading.."*/
            cache: false,
            timeout:50000, /* Timeout in ms */

            success: function(data){ /* called when request to barge.php completes */
                addmsg("new", data); /* Add response to a .msg div (with the "new" class)*/
                setTimeout(
                    'waitForMsg()', /* Request next message */
                    1000 /* ..after 1 seconds */
                );
            },
            error: function(XMLHttpRequest, textStatus, errorThrown){
                addmsg("error", textStatus + " (" + errorThrown + ")");
                setTimeout(
                    'waitForMsg()', /* Try again after.. */
                    "15000"); /* milliseconds (15seconds) */
            },
        });
    };

    $(document).ready(function(){
        waitForMsg(); /* Start the inital request */
    });
    </script>
</head>
<body>
    <div id="messages">
        <div class="msg old">
            BargePoll message requester!
        </div>
    </div>
</body>
</html>

Y aquí está mi código de servidor:

import sys
if __name__ == "__main__":
    sys.stdout.write("Content-Type: text/html\r\n\r\n")
    print "<html><body>"
    for i in range(10):
        print "<div>%s</div>" % i
        sys.stdout.flush()
    print "</body></html>"

Estoy esperando que la página de mi cliente muestre 1 número a la vez (0,1,2, ...), pero los datos siempre salen todos a la vez (01234 ...). Por favor, ayúdame a resolverlo. Muchísimas gracias chicos.

Solo un poco fuera de lugar, estoy tratando de usar el complemento jquery comet, pero no pude encontrar suficiente documentación. Las ayudas serían muy apreciadas. Gracias de nuevo: D

[edit] Ok, chicos, finalmente gracias a vuestros guías, he logrado hacer que funcione. Tienes razón cuando predices que mod_deflate es la fuente de todo esto.

En resumen, lo que he hecho aquí:

Para el cliente, haga una página de encuesta larga como el código html anterior

Para el servidor, deshabilite el mod_deflate editando el archivo /etc/apache2/mods-available/deflate.conf, comente la línea con la parte text / html y reinicie el servidor. Para asegurarse de que Python no almacena en búfer la salida, incluya #! / Usr / bin / python -u al principio de la página. Recuerde usar sys.stdout.flush () después de cada impresión que desee que aparezca en el cliente. El efecto puede no ser transparente, debe incluir time.sleep (1) para probar. :RE

Muchísimas gracias a ustedes por apoyar y ayudar a resolver esto: D

Respuestas a la pregunta(4)

Su respuesta a la pregunta