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)

...

「何とか何とか」が返されますが、接続が閉じられていないようで、サーバーを中止するまでスクリプトが永遠に待機しています。(「do_GET()」の最後の部分が計算されると、BaseHTTPServerは自動的に接続を閉じると思いますが、スクリプトを再起動することでこれを防ぎます。)

私が正しければ、どうすれば接続を閉じることができますか? そうでない場合、他に何が問題になっている可能性がありますか?

編集:サーバースクリプトはプログラム全体を再起動する必要があります。

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 に答える