Я сделал приложение python, которое я хотел бы развернуть в Интернете. Я нахожусь на Mac, поэтому я включил веб-сервер и сбросил его в мой контейнер cgi-, и он отлично работает. Проблема в том, что приложение выполняет некоторые интенсивные вычисления, и я бы очень хотел, чтобы пользователь знал, что происходит во время его выполнения.
Несмотря на то, что у меня есть оператор print
, разбросанный по всему коду, он ничего не выводит на мой браузер, пока все не будет выполнено. Есть ли способ исправить это для выполнения кода при его обработке?
Если 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 и настраиваете обработчик каждый раз, когда получаете данные, вы сможете "потопить" его как это происходит.
Вероятно, лучший подход к чему-то подобному, чтобы разобраться в ваших проблемах. Создайте экран типа "консоль" ajax-, который, например, будет опросить файл журнала, который будет записан в рабочий процесс.
Вместо "print" вы можете попробовать
sys.stdout.write('something something something')
sys.stdout.flush()
Это гарантирует, что веб-сервер не ждет заполнения буфера.