1

我有一个向 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()”的最后一部分时自动关闭连接,但我通过重新启动脚本来防止这种情况。)

如果我是对的,我该如何关闭连接?如果不是,还有什么问题?

编辑:服务器脚本必须重新启动整个程序。

4

1 回答 1

1

当你执行:

os.execl(python, python, * sys.argv)

os.exec*的 Python文档是这样说的:

这些函数都执行一个新程序,替换当前进程;他们不回来。在 Unix 上,新的可执行文件被加载到当前进程中,并且将具有与调用者相同的进程 ID。错误将报告为 OSError 异常。

因此,当您调用该函数时,该do_GET函数会挂起并且永远不会返回,因此 HTTP 服务器永远不会刷新 HTTP 消息的结尾。

我认为在您的情况下,最简单的更改是在调用 exec 之前调用os.fork,然后仅在子进程中调用 exec。让父进程从 do_GET 函数返回。

于 2012-09-09T20:40:50.900 回答