【问题标题】:Python Mod_WSGI Output BufferPython Mod_WSGI 输出缓冲区
【发布时间】:2009-06-01 18:05:40
【问题描述】:

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

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

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

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

我在当前设置中看到的缺点是,如果发生错误,我无法轻易中断缓冲区并在页面线程不继续运行的情况下退出。

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

【问题讨论】:

    标签: python buffer mod-wsgi output-buffering


    【解决方案1】:

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

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

    【讨论】:

    • 我不喜欢这种方法,因为发送分块网站总是加载速度更快,因为您无需等待页面完成编译,然后用户才能开始接收它。最终结果是减少了下载时间。
    • 这也让开发变得更加烦人,因为错误导致输出为零(使调试变得非常棘手)。
    • @Ian - 无论如何,页面都会被 TCP/IP 分块。如果生成页面需要很长时间,那么将页面分块确实 有意义,但大多数页面不会。在大多数情况下,在通过网络发送一页之前,您可以从字面上生成数千次(如果不是数百万或数十亿次)页面。如果您正在查询数据库以生成页面,情况也是如此。换句话说,您将获得的任何速度优势都可以忽略不计。因此,您最好做最简单的事情。
    • 我开始认为我必须这样做,但我仍然更愿意以分块的方式做事,因为它让我在未来有更多选择。
    • @Ian - 我相信 YAGNI 过于简单化了,但我觉得它适用于这种情况:en.wikipedia.org/wiki/You_Ain't_Gonna_Need_It
    【解决方案2】:

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

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

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

    这里是 CherrPy 的一些基本实现以及它是如何工作的http://www.cherrypy.org/wiki/ReturnVsYield

    【讨论】:

    • 这实际上正是我正在做的,但为了使代码干净,我需要制作一个输出缓冲区,以便只有在堆积了足够多的 html 时才会产生输出。每次有东西要发送时让步会减慢 apache。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 2012-02-26
    • 2020-05-16
    • 2014-09-26
    • 2015-08-20
    相关资源
    最近更新 更多