我制作了一个我想要部署到网络上的python应用程序。我在Mac上,所以我启用了Web服务器并将其放在我的cgi-bin中,它运行正常。问题是,应用程序进行了一些密集的计算,我真的想让用户知道正在执行的是什么。
即使我在代码中散布了print
语句,但在完成整个操作之前,它不会向浏览器输出任何内容。有没有办法解决这个问题,以便在处理代码时执行代码?
答案 0 :(得分:1)
您可能想尝试
而不是'print'sys.stdout.write('something something something')
sys.stdout.flush()
这将确保Web服务器不等待缓冲区填满。
答案 1 :(得分:1)
如果sys.stdout.flush()没有做到这一点,那么问题很可能通过分块编码传输来解决。
为了给出一点背景知识,chunked-encoding定义了一种机制,在这种机制中,服务器预先告诉客户端“我的数据流没有限制”,并且作为一种效率,数据以块的形式传输,而不仅仅是流媒体内容不知不觉。
这是一个简单的例子,重要的是你如何发送你使用的数据和标题。
这方面的另一个方面是浏览器实际上对数据进行了,即使你的cgi正在向浏览器发送数据,它可能只是坐在它上面直到它完成。
通过以下示例,curl显示正在流中正确下载的每个“块”,Safari仍然会等待CGI完成。
#!/usr/bin/python
import time
import sys
def chunk(msg=""):
return "\r\n%X\r\n%s" % ( len( msg ) , msg )
sys.stdout.write("Transfer-Encoding: chunked\r\n")
sys.stdout.write("Content-Type: text/html\r\n")
for i in range(0,1000):
time.sleep(.1)
sys.stdout.write( chunk( "%s\n" % ( 'a' * 80 ) ) )
sys.stdout.flush()
sys.stdout.write(chunk() + '\r\n')
因此,如果您只是使用浏览器连接到此CGI,是的,您将看不到任何更改 - 但是如果您使用AJAX技术并在每次获取数据时设置处理程序,您将能够“流式传输”它因为它进来了。
答案 2 :(得分:1)
可能是解决问题的最佳方法。创建一个ajax-drive“控制台”类型的显示,例如,它将轮询一个日志文件,该文件在工作进程中写入。