Python Mod_WSGI выходной буфер - PullRequest
0 голосов
/ 01 июня 2009

Это немного сложный вопрос;

Я работаю с mod_wsgi в python и хочу создать буфер вывода, который выдает HTML на постоянной основе (до тех пор, пока страница не загрузится).

Прямо сейчас у меня настроен сценарий так, что функция Application () создает отдельный поток 'Page' для кода страницы, а затем сразу же запускает непрерывный цикл для буфера вывода с использованием библиотеки Python Queue lib.

Есть ли лучший способ настроить это? Я думал о том, чтобы сделать Output Buffer потоком (а не Page), но проблема в том, что функция Application () - единственная функция, которая может передавать HTML в Apache, который (насколько я могу судить, делает эту идею невозможной).

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

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

Ответы [ 2 ]

2 голосов
/ 02 июня 2009

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

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

Причина, по которой я упоминаю об этом, состоит в том, чтобы указать, что если у вас проблемы с производительностью, скорее всего, это не потому, что вы буферизуете вывод. Самый простой способ справиться с этим - сделать что-то вроде этого:

def Application(environ, start_response):
    start_response('200 Ok', [('Content-type','text/plain')])
    response = []
    response.append('<h1>')
    response.append('hello, world!')
    response.append('</h1>')
    return [''.join(response)] #returns ['<h1>hello, world!</h1>']

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

2 голосов
/ 01 июня 2009

mod_wsgi должен иметь встроенную поддержку генераторов. Поэтому, если вы используете Framework, такой как CherryPy, вам просто нужно сделать:

def index():
    yield "Some output"
    #Do Somemore work
    yield "Some more output"

Где каждый выход вернет пользователю кусок страницы.

Вот некоторые основы из CherrPy по реализации и как она работает http://www.cherrypy.org/wiki/ReturnVsYield

...