Python Mod_WSGI输出缓冲区

时间:2009-06-01 18:05:41

标签: python buffer mod-wsgi output-buffering

这是一个棘手的问题;

我正在使用python中的mod_wsgi,并希望创建一个输出缓冲区,持续生成HTML(直到页面加载完毕)。

现在我已经设置了我的脚本,以便Application()函数为页面代码创建一个单独的“Page”线程,然后立即使用python的Queue lib为输出缓冲区运行一个连续循环。

有没有更好的方法进行此设置?我想过让输出缓冲区成为线程(而不是Page),但问题是,Application()函数是唯一可以将HTML交给Apache的函数,据我所知,使这个想法变得不可能。)

我在当前设置中看到的缺点是,如果发生错误,我无法轻松地中断缓冲区并退出而页面线程不会持续一段时间。

(有点糟糕的是,mod_wsgi没有构建输出缓冲区来处理这个问题,我讨厌加载整个页面然后只发送一次输出,导致页面加载速度慢得多。)

2 个答案:

答案 0 :(得分:2)

mod_wsgi应该内置对Generators的支持。因此,如果你使用像CherryPy这样的框架,你只需要这样做:

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

每个产量将返回给用户一个页面的块。

以下是CherrPy关于实施及其工作原理的一些基础知识http://www.cherrypy.org/wiki/ReturnVsYield

答案 1 :(得分:2)

  

(有点糟糕的是,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>']

你最好的选择是使用像列表这样的可变数据结构来保存消息的块,然后像我上面那样将它们连接在一起。除非你有某种特殊需要,否则这可能是最好的一般方法。