0

这是一个有点棘手的问题;

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

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

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

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

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

4

2 回答 2

2

mod_wsgi 应该内置对生成器的支持。因此,如果您使用像 CherryPy 这样的框架,您只需要:

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

每个收益将返回给用户的页面块。

这是 CherrPy 的一些基础知识,关于那里的实现以及它是如何工作的http://www.cherrypy.org/wiki/ReturnVsYield

于 2009-06-01T18:45:04.103 回答
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>']

最好的办法是使用可变数据结构(如列表)来保存消息的块,然后将它们连接到一个字符串中,就像我在上面所做的那样。除非您有某种特殊需要,否则这可能是最好的通用方法。

于 2009-06-01T23:41:08.140 回答