Python в Интернете: выполнение кода в процессе его обработки? - PullRequest
1 голос
/ 27 мая 2011

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

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

Ответы [ 3 ]

1 голос
/ 28 мая 2011

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

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

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

Другим аспектом этого является то, что браузер на самом деле делает с данными, как они поступают, даже если ваш 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 и настраивать обработчик каждый раз, когда получаете данные, вы сможете их «передавать» в потоковом режиме. как оно приходит.

1 голос
/ 28 мая 2011

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

1 голос
/ 27 мая 2011

Вместо «печати» вы можете попробовать

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...