我正在写一个简单的基于浏览器的前端,应该能够启动后台任务,然后从中获得进展。我希望浏览器收到一个响应,说明任务是否成功启动,然后轮询以确定何时完成。但是,后台任务似乎阻止了立即发送XMLHttpRequest响应,所以我无法报告启动该进程的成功。考虑以下(简化)代码:为什么后台任务会阻止SimpleHTTPServer中的响应?
import SocketServer
import SimpleHTTPServer
import multiprocessing
import time
class MyProc(multiprocessing.Process):
def run(self):
print 'Starting long process..'
for i in range(100): time.sleep(1)
print 'Done long process'
class Page(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
print >>self.wfile, "<html><body><a href='/run'>Run</a></body></html>"
if self.path == '/run':
self.proc = MyProc()
print 'Starting..'
self.proc.start()
print 'After start.'
print >>self.wfile, "Process started."
httpd = SocketServer.TCPServer(('', 8000), Page)
httpd.serve_forever()
当我运行这一点,并浏览到http://localhost:8000,我得到了一个名为“运行”按钮。当我点击它,在终端显示:
Starting..
After start.
但是浏览器视图不会更改。其实光标在打转。只有当我在终端中按下Ctrl-C来中断程序时,浏览器才会更新并显示消息Process started.
消息After start
显然正在打印。因此,我可以假定do_GET
在启动过程后正在返回。然而,在我中断了长时间运行的过程之后,浏览器才得到响应。我必须得出结论,在do_GET
和发送的响应之间有一些阻塞,它在SimpleHTTPServer
之内。
我也试过这与线程和subprocess.Popen,但遇到类似的问题。有任何想法吗?
p.s.我正在使用Python 2.6.5。没有在其他版本上测试过。 – Steve 2010-10-20 01:58:11
您不发送HTTP响应。请先查看'do_GET'的基本实现在覆盖之前实际执行的操作,而不提供适当的替代。 – 2010-10-20 10:53:38
在“进程启动”之前添加'print >> self.wfile,“Content-Type:text/plain \ n”'没有实际意义,结果是一样的。 – Steve 2010-10-20 13:16:26