我通过创建一个继承自HTTPServer和ThreadingMixIn的类来设置一个线程(使用Python线程)HTTP服务器:
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
Run Code Online (Sandbox Code Playgroud)
我有一个继承自BaseHTTPRequestHandler的处理程序类,我用这样的东西启动服务器:
class MyHandler(BaseHTTPRequestHandler):
...
server = ThreadedHTTPServer(('localhost', 8080), MyHandler)
# Prevent issues with socket reuse
server.allow_reuse_address = True
# Start the server
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
这一切都非常简单.我遇到的问题是,ThreadingMixIn,ForkingMixIn或其他方式,请求最终阻止请求处理程序返回.通过实现此示例代码可以很容易地看到这一点:
class MyHandler(BaseHTTPRequestHandler):
def respond(self, status_code):
self.send_response(status_code)
self.end_headers()
def do_GET(self):
print "Entered GET request handler"
time.sleep(10)
print "Sending response!"
respond(200)
Run Code Online (Sandbox Code Playgroud)
如果服务器同时处理这些,那么我们将能够发送两个请求并看到服务器在发送任何响应之前输入两个GET请求处理程序.相反,服务器将为第一个请求输入GET请求处理程序,等待它返回,然后输入第二个请求(因此第二个请求需要大约20秒才能返回而不是10).
有没有一种直接的方法让我实现一个系统,服务器不等待处理程序返回?具体来说,我正在尝试编写一个系统,在返回任何请求之前等待接收多个请求(一种长轮询)并遇到第一个请求等待阻止任何未来请求连接到服务器的问题.