【问题标题】:Show progress of PYTHON CGI script显示 Python CGI 脚本的进度
【发布时间】:2011-12-22 16:25:17
【问题描述】:

我有一个 PYTHON CGI 脚本(内容类型:text/plain),执行大约需要 10 分钟。 我想在浏览器上查看我的脚本的执行状态。

如下:

执行脚本的第 1 部分...

执行脚本的第 2 部分..

执行脚本的第 3 部分..

执行完成

我正在使用打印语句,但它仅在脚本执行完成后才将所有打印语句全部输出,而不是一一输出。

请帮忙..

【问题讨论】:

  • 您使用的网络服务器是什么?渐进式响应需要具有分块编码功能的HTTP/1.1 服务器。
  • 我认为@TokenMacGuy 是对的。可能正在发生的事情是您的输出正在被缓冲。

标签: python cgi show progress


【解决方案1】:

我怀疑真正的阻塞点是网关(Web 服务器),而不是您的 CGI 应用程序。从技术上讲,网关必须验证响应并确保它符合网关与客户端一起使用的 HTTP 版本。

在处理完所有请求之前,我不确定是否允许网关转发标头。如果您查看第 3.1 节“服务器职责”下的CGI specification,您可以阅读以下内容:

服务器必须对本规范要求的客户端请求数据执行翻译和协议转换。此外,即使 CGI 脚本不符合此规范,服务器仍对客户端负责以符合相关的网络协议。

如果脚本需要很长时间才能运行并且您希望定期更新,那么最好重新考虑您的架构。看看这种方法的更多经典策略,主要是让脚本在后台进程中运行,该进程写入数据库并编写一些 AJAX 代码以从服务器中提取通知。根据您用作服务器堆栈的内容,您还可以编写应用程序以通过 web socket 进行通信,这将允许您保持持续连接并随时发送更新。

【讨论】:

    【解决方案2】:

    尝试做:

    import sys
    ...
    
    print "Part 1 of script executed..."
    sys.stdout.flush() # do this after the print
    

    这会刷新标准输出缓冲区,这可能是您的问题之一。您的浏览器或网络服务器也很可能导致此行为,在这种情况下解决此问题将更加困难。


    我不确定您要在这里做什么,但您可能希望使用 AJAX 异步触发您的脚本,然后异步加载数据。对于浏览器和网络服务器来说,这种行为比需要几分钟的 cgi 脚本要好。

    【讨论】:

      【解决方案3】:

      尝试yielding 部分输出,而不是returning 完整回复。你在使用任何网络框架吗? Web.py has a good example。正如他们所说,

      [...] 您需要确保添加 Transfer-Encoding 分块标头以使其正确显示。否则浏览器会在显示给你之前缓冲所有数据。

      如果您没有使用 web.py 或其他 Web 框架,无论如何您都可以尝试一下——不过我不知道它是否会起作用。

      【讨论】:

      • 感谢您向我介绍 web.py...但是 sys.stdout.flush() 是我正在寻找的...
      猜你喜欢
      • 2019-12-28
      • 2015-10-05
      • 2014-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-17
      • 2017-11-02
      • 1970-01-01
      相关资源
      最近更新 更多