Python в Интернете: выполнение кода в процессе его обработки?

1

Я сделал приложение python, которое я хотел бы развернуть в Интернете. Я нахожусь на Mac, поэтому я включил веб-сервер и сбросил его в мой контейнер cgi-, и он отлично работает. Проблема в том, что приложение выполняет некоторые интенсивные вычисления, и я бы очень хотел, чтобы пользователь знал, что происходит во время его выполнения.

Несмотря на то, что у меня есть оператор print, разбросанный по всему коду, он ничего не выводит на мой браузер, пока все не будет выполнено. Есть ли способ исправить это для выполнения кода при его обработке?

  • 1
    Добро пожаловать в WWW. ;-) Как правило, браузеры ждут, пока они соберут весь ввод, прежде чем отображать страницу. Для получения обновлений в реальном времени потребуется нечто более сложное, например, AJAX / Comet.
  • 0
    Спасибо ... Прочитал вчера; попробовал скрытую технику iframe и AJAX, но не повезло
Теги:
cgi

3 ответа

1

Если sys.stdout.flush() не выполнил трюк, проблема, скорее всего, будет решена путем переноса кодировки chunked-.

Чтобы дать немного фона, кодировка chunked- определяет механизм, в котором up- фронт сервера будет сообщать клиенту, что "Мой поток данных не имеет ограничений", и, как эффективность, данные передаются в кусках в противоположность просто потоковое содержимое willy- nilly.

Вот простой пример: важно, как вы отправляете данные и заголовки, которые используете.

Другим аспектом этого является то, что браузер действительно делает с данными по мере их поступления, даже если ваш cgi отправляет данные в браузер, он может просто сидеть на нем, пока это не закончится.

В следующем примере curl показывает, что каждый "кусок" загружается правильно в потоке, Safari все еще висит, ожидая завершения CGI.

#!/usr/bin/python
import time
import sys

def chunk(msg=""):
    return "\r\n%X\r\n%s" % ( len( msg ) , msg )

sys.stdout.write("Transfer-Encoding: chunked\r\n")
sys.stdout.write("Content-Type: text/html\r\n")

for i in range(0,1000):
    time.sleep(.1)
    sys.stdout.write( chunk( "%s\n" % ( 'a' * 80 ) ) )
    sys.stdout.flush()

sys.stdout.write(chunk() + '\r\n')

Итак, если вы просто подключаетесь к этому CGI с вашим браузером, да, вы не увидите никаких изменений. Однако, если вы используете методы AJAX и настраиваете обработчик каждый раз, когда получаете данные, вы сможете "потопить" его как это происходит.

  • 0
    Все ближе! Теперь он отправляет ответ с подтверждением сразу после обработки заголовка ... Но все еще группирует остальную часть моего текста вместе, не могу понять, почему
  • 0
    На самом деле, это работает в Firefox, но не в Chrome :( Я читал, что длина сообщения должна быть в шестнадцатеричном формате, но это не исправило это.
Показать ещё 1 комментарий
1

Вероятно, лучший подход к чему-то подобному, чтобы разобраться в ваших проблемах. Создайте экран типа "консоль" ajax-, который, например, будет опросить файл журнала, который будет записан в рабочий процесс.

1

Вместо "print" вы можете попробовать

sys.stdout.write('something something something')
sys.stdout.flush()

Это гарантирует, что веб-сервер не ждет заполнения буфера.

  • 0
    stackoverflow.com/questions/5227166/...
  • 0
    Пробовал использовать flush (), но это не помогло ... Эта ссылка вновь подтверждает проблему, но не предлагает решения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню