我有一个向HTTP服务器发送请求的脚本。
HTTP服务器脚本(代码段):
...
class MyHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(sa):
pdict = cgi.parse_header(sa.headers.getheader('referer'))
q = pdict[0]
q = urllib.unquote(q)
if q == "enternetixplorer" # basically just ignore this, doesn't have to do with the question
sa.wfile.write("blah blah blah")
# now restart server
httpd.server_close()
python = sys.executable
os.execl(python, python, * sys.argv)
...
“blah blah blah”被发回,但连接似乎没有关闭,我的脚本一直在等待,直到我中止服务器。 (我的想法是BaseHTTPServer在计算“do_GET()”的最后一部分时自动关闭连接,但是我通过重新启动脚本来防止这种情况。)
如果我是对的,我该如何关闭连接?如果没有,还有什么可能是问题?
编辑: 服务器脚本必须重新启动整个程序。
答案 0 :(得分:1)
执行时:
os.execl(python, python, * sys.argv)
Python documentation for os.exec*说:
这些函数都执行一个新程序,取代当前的程序 处理;他们不回来。在Unix上,加载了新的可执行文件 进入当前进程,并将具有相同的进程ID 呼叫者。错误将报告为OSError异常。
因此,当您调用该函数时,do_GET
函数会挂起并且永不返回,因此HTTP服务器永远不会刷新HTTP消息的结尾。
我认为在您的情况下,最简单的更改是在调用exec之前调用os.fork,然后仅在子进程中调用exec。让父进程从do_GET函数返回。