Показать прогресс скрипта PYTHON CGI - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть PYTHON CGI-скрипт (Content-type: text / plain ), выполнение которого занимает около 10 минут. Я хочу видеть статус выполнения моего скрипта в моем браузере.

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

Часть 1 скрипта выполнена ...

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

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

Выполнение завершено

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

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

Ответы [ 3 ]

5 голосов
/ 22 декабря 2011

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

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

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

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

2 голосов
/ 22 декабря 2011

Попробуйте выполнить:

import sys
...

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

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

1 голос
/ 22 декабря 2011

Попробуйте yield выводить часть за частью вместо return с полным ответом. Вы используете какой-либо веб-фреймворк? Хороший пример - Web.py . Как говорится,

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

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

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