Python Mod_WSGI 输出缓冲区

0 投票
2 回答
1615 浏览
提问于 2025-04-15 11:58

这个问题有点复杂;

我正在用Python的mod_wsgi,想要创建一个输出缓冲区,这样可以持续不断地输出HTML,直到页面加载完成。

现在我的脚本设置是,Application()函数会为页面代码创建一个单独的“页面”线程,然后紧接着,它会使用Python的Queue库运行一个持续的循环来处理输出缓冲区。

有没有更好的方法来设置这个呢?我考虑过让输出缓冲区成为线程(而不是页面线程),但这样做的问题是,Application()函数是唯一可以将HTML发送给Apache的函数,这样一来,这个想法就行不通了。

我现在设置的缺点是,如果发生错误,我不能轻易地中断缓冲区并退出,因为页面线程还会继续运行一段时间。

(mod_wsgi没有内置的输出缓冲区来处理这个问题真让人失望,我不喜欢先加载整个页面再一次性发送输出,这样会导致页面加载变得更慢。)

2 个回答

2

mod_wsgi 应该自带对生成器的支持。所以如果你在使用像 CherryPy 这样的框架,你只需要这样做:

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

在这里,每次 yield 都会把页面的一部分返回给用户。

这里有一些 CherryPy 的基本信息,介绍了它们的实现方式和工作原理,详细内容可以查看 http://www.cherrypy.org/wiki/ReturnVsYield

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>']

你最好的选择是使用像列表这样的可变数据结构来保存消息的各个部分,然后将它们合并成一个字符串。除非你有特殊需求,这可能是最好的通用方法。

撰写回答