显示PYTHON CGI脚本的进度

时间:2011-12-22 16:25:17

标签: python cgi show progress

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

如下所示:

  

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

     

脚本执行的第2部分..

     

脚本执行的第3部分..

     

执行完成

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

请帮助..

3 个答案:

答案 0 :(得分:5)

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

我不确定甚至允许网关转发标头,直到处理完所有请求。如果您查看3.1“服务器职责”部分下的CGI specification,您可以阅读以下内容:

  

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

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

答案 1 :(得分:2)

尝试做:

import sys
...

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

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


我不确定你在这里尝试做什么,但你可能想要使用AJAX异步启动你的脚本然后异步加载数据。对于浏览器和Web服务器来说,这是一个比cgi脚本需要几分钟更好的行为。

答案 2 :(得分:1)

逐个尝试yield输出,而不是return完整响应。您使用的是任何Web框架吗? Web.py has a good example。正如他们所说,

  

[...]您需要确保添加Transfer-Encoding chunked标头才能正常显示。否则,浏览器将缓冲所有数据,然后再显示给您。

如果你没有使用web.py或其他网页框架,你可以尝试一下 - 我不知道它是否会起作用。