Processando Solicitações Simultâneas / Assíncronas com Base PythonHTTPServer
Eu configurei um servidor HTTP encadeado (com encadeamentos Python) criando uma classe que herda de HTTPServer e ThreadingMixIn:
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
Eu tenho uma classe de manipulador que herda de BaseHTTPRequestHandler e eu inicio o servidor com algo como isto:
class MyHandler(BaseHTTPRequestHandler):
...
server = ThreadedHTTPServer(('localhost', 8080), MyHandler)
# Prevent issues with socket reuse
server.allow_reuse_address = True
# Start the server
server.serve_forever()
Tudo isso é bem simples. O problema que estou encontrando é que, ThreadingMixIn, ForkingMixIn ou caso contrário, a solicitação acaba bloqueando no manipulador de solicitação para retornar. Isso pode ser facilmente visto implementando este código de exemplo:
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)
Se o servidor estivesse processando-os simultaneamente, poderíamos enviar duas solicitações e ver o servidor inserir os dois manipuladores de solicitação GET antes de enviar qualquer resposta. Em vez disso, o servidor entrará no manipulador de solicitações GET para a primeira solicitação, aguardará a sua devolução e, em seguida, a inserirá na segunda (assim, a segunda solicitação levará ~ 20 segundos para retornar, em vez de 10).
Existe uma maneira simples de implementar um sistema em que o servidor não aguarde o retorno do manipulador? Especificamente, estou tentando gravar um sistema que aguarda receber várias solicitações antes de retornar qualquer uma delas (uma forma de pesquisa longa) e executar problemas em que a primeira solicitação em espera bloqueia a conexão de futuras solicitações ao servidor.