4

メイン スレッドが HTTP サーバーを起動し、正確に 1 つの HTTP 要求を最大 10 秒間待機する必要があるアプリケーションを作成したいと考えています。要求が受信 (および処理) されるか、タイムアウトを超えるまで、アプリケーションをブロックする必要があります。

私はこのコードを使用しようとしました:

import BaseHTTPServer

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def do_GET(s):
        s.send_response(200)
        s.send_header("Content-type", "text/html")
        s.end_headers()
        s.wfile.write("<html><head><title>Title</title></head>")

httpd = BaseHTTPServer.HTTPServer(('', 8001), RequestHandler)
httpd.socket.settimeout(10)
httpd.handle_request()

問題は、サーバーがリクエストを受信すると、次のエラー メッセージが表示されることです。

Exception happened during processing of request from ('127.0.0.1', 51321)
Traceback (most recent call last):
  File "C:\Python27\lib\SocketServer.py", line 284, in _handle_request_noblock
    self.process_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 310, in process_request
    self.finish_request(request, client_address)
  File "C:\Python27\lib\SocketServer.py", line 323, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "C:\Python27\lib\SocketServer.py", line 639, in __init__
    self.handle()
  File "C:\Python27\lib\BaseHTTPServer.py", line 343, in handle
    self.handle_one_request()
  File "C:\Python27\lib\BaseHTTPServer.py", line 313, in handle_one_request
    self.raw_requestline = self.rfile.readline(65537)
  File "C:\Python27\lib\socket.py", line 476, in readline
    data = self._sock.recv(self._rbufsize)
error: [Errno 10035] A non-blocking socket operation could not be completed immediately

settimeout 関数を削除すると、このエラーは発生しませんが、タイムアウトも失われました。setblocking 関数も使用しようとしましたが、settimeout の効果を破壊します。

どうすれば目標を達成できますか?

PS .: 64 ビットの Windows 7 で Python 2.7.2 を使用しています。

4

0 に答える 0