2011-12-22 3 views
3

У меня есть ПИТОН CGI скрипт (Content-Type: текст/обычный), который занимает около 10 минут, чтобы выполнить. Я хочу видеть статус выполнения моего сценария в моем браузере.Показать прогресс ПИТОН CGI скрипт

Как показано ниже:

ч.1 скрипт, который выполняется ...

Часть 2 сценария выполненной ..

Часть 3 сценария выполненного ..

Исполнение Полное

Я использую операторы печати, но это выводит все операторы печати в одно целое только после того, как скрипт завершил выполнение, а не один за другим.

Пожалуйста, помогите ..

+2

Что вы хотите, чтобы использовать веб-сервер? Для прогрессивного ответа требуется сервер с поддержкой HTTP/1.11 с возможностью кодирования с кодировкой. – SingleNegationElimination

+0

Я думаю @TokenMacGuy прав. Вероятно, происходит то, что ваш выход буферизуется. – jcollado

ответ

2

Попробуйте сделать:

import sys 
... 

print "Part 1 of script executed..." 
sys.stdout.flush() # do this after the print 

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


Я не уверен, что вы пытаетесь сделать, но вы можете использовать AJAX для асинхронного выпалить сценарий, а затем асинхронно загружать данные обратно. Это лучшее поведение для браузеров и веб-серверов для обработки, чем cgi-скрипт, занимающий несколько минут.

+0

спасибо ... это именно то, что мне нужно. – AnonGeek

5

Я подозреваю, что реальной точкой блокировки является шлюз (веб-сервер), а не приложение CGI. Шлюз технически должен проверять ответ и убедиться, что он соответствует версии HTTP, которую шлюз использует с клиентом.

Я не уверен, что шлюзу даже разрешено пересылать заголовки до тех пор, пока все запросы не будут обработаны. Если вы посмотрите на CGI specification в разделе 3.1 «Обязанность сервера», вы можете прочитать следующее:

сервера должен выполнять переводы и преобразование протоколов по данным запроса клиента, необходимых в данной спецификации. Кроме того, сервер несет ответственность перед клиентом, чтобы он соответствовал соответствующему сетевому протоколу, даже если сценарий CGI не соответствует этой спецификации.

Если сценарий занимает много времени, и вы хотите периодические обновления, вам гораздо лучше пересмотреть свою архитектуру. Взгляните на более классические стратегии для этого подхода, в основном имея сценарий, выполняемый в фоновом процессе, который записывает в базу данных и записывает некоторый код AJAX для извлечения уведомлений с сервера. В зависимости от того, что вы используете в качестве стека серверов, вы также можете написать приложение для связи через web socket, что позволит вам поддерживать непрерывное соединение и отправлять обновления, когда захотите.

+0

спасибо за объяснение ... – AnonGeek

1

Пробег: yield Исходная часть для партии по частям вместо return полная реакция. Используете ли вы какую-либо веб-инфраструктуру? Web.py has a good example.Как говорится,

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

Если вы не используете web.py или другую веб-инфраструктуру, вы можете попробовать все равно - я не знаю, будет ли это работать.

+0

спасибо, что представил меня на web.py ... однако sys.stdout.flush() - это то, что я искал ... – AnonGeek

Смежные вопросы