我有一个 PYTHON CGI脚本(内容类型: text / plain ),大约需要10分钟才能执行。 我想在浏览器上看到我的脚本的执行状态。
如下所示:
脚本执行的第1部分......
脚本执行的第2部分..
脚本执行的第3部分..
执行完成
我正在使用print语句,但它只在脚本完成执行后才将所有print语句全部输出,而不是一个一个地输出。
请帮助..
答案 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或其他网页框架,你可以尝试一下 - 我不知道它是否会起作用。