Отображать результат на веб-странице, как только данные будут доступны на сервере

Я пишу страницу CGI в Python. Допустим, клиент отправляет запрос на мою страницу cgi. Моя cgi-страница выполняет вычисления и, как только она получает первый вывод, отправляет этот вывод клиенту, ноПРОДОЛЖИТЬ сделать расчет и отправить другие ответыПОСЛЕ первый ответ отправлен.

Возможно ли то, что я здесь представил? Я задаю этот вопрос, потому что, насколько мне известно, на странице cgi ответы отправляются обратно на однократной основе, после отправки ответа cgi-страница перестает работать. Это сделано на стороне сервера или на стороне клиента, и как мне это реализовать?

Мой сервер работает под управлением Apache. Большое спасибо.

Я попробовал клиентский код из "dbr" на этом форуме (благодаря ему я понял, как долго работает опрос).

<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>

И вот мой код сервера:

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>"

Я ожидаю, что на моей клиентской странице будет отображаться по 1 номеру за раз (0,1,2, ...), но данные всегда появляются сразу (01234 ...). Пожалуйста, помогите мне разобраться. Большое спасибо, ребята.

Просто немного не в себе, я пытаюсь использовать плагин кометы jquery, но я не смог найти достаточно документации. Помогает, будет высоко ценится. Еще раз спасибо: D

[править] Хорошо, ребята, наконец-то, благодаря вашим руководителям, мне удалось заставить его работать. Вы правы, когда предсказываете, что mod_deflate является источником всего этого.

Подводя итог, что я сделал здесь:

Для клиента сделайте длинную страницу опроса в виде HTML-кода выше

Для сервера отключите mod_deflate: отредактируйте файл /etc/apache2/mods-available/deflate.conf, закомментируйте строку с частью text / html и перезапустите сервер. Чтобы Python не буферизировал сам вывод, включите #! / Usr / bin / python -u в начале страницы. Не забудьте использовать sys.stdout.flush () после каждой печати, которую вы хотите отобразить на клиенте. Эффект может быть не прозрачным, должен включать time.sleep (1) для тестирования. : D

Спасибо вам, ребята, за поддержку и помощь в решении этой проблемы: D

Ответы на вопрос(4)

Ваш ответ на вопрос