我有一个奇怪的问题,如果在请求处理程序中由 subprocess.Popen 生成一个新进程,则 SimpleHTTPRequestHandler 中的请求返回被阻止。但是 Popen 不应该是异步的吗?
该行为可以通过以下文件重现,并在我的 OS X 机器上使用 Python 2.6.7 以及在 SLES 机器上使用 ActivePython 2.6:webserver.py:
#!/usr/bin/env python
import SimpleHTTPServer
import SocketServer
import subprocess
import uuid
class MyRequestHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def do_POST(self):
print 'in do_POST'
uuid_gen = str(uuid.uuid1())
subprocess.Popen(['python', 'sleep.py'])
print 'subprocess spawned'
return self.wfile.write(uuid_gen)
Handler = MyRequestHandler
server = SocketServer.TCPServer(('127.0.0.1', 9019), Handler)
server.serve_forever()
睡眠.py:
import time
time.sleep(10)
当我现在启动网络服务器,然后向 localhost:9019 发出 curl POST 请求时,网络服务器会立即打印:
$python2.6 webserver2.py
in do_POST
subprocess spawned
但在我执行 curl 请求的控制台上,它显示以下行为:
$curl -X POST http://127.0.0.1:9019/
<wait ~10 seconds>
cd8ee24a-0ad7-11e3-a361-34159e02ccec
当我使用 Python 2.7 运行相同的设置时,答案会立即出现在 curl 站点上。这怎么会发生,因为 Popen 似乎并没有阻止打印,而只是阻止了返回?问题是由于遗留原因我必须使用 python 2.6,那么让请求立即返回的最佳解决方法是什么?