Przetwarzanie żądań symultanicznych / asynchronicznych za pomocą Python BaseHTTPServer
Skonfigurowałem serwer wątków HTTP (z wątkami Pythona), tworząc klasę dziedziczącą z HTTPServer i ThreadingMixIn:
class ThreadedHTTPServer(ThreadingMixIn, HTTPServer):
pass
Mam klasę obsługi, która dziedziczy z BaseHTTPRequestHandler i uruchamiam serwer z czymś takim:
class MyHandler(BaseHTTPRequestHandler):
...
server = ThreadedHTTPServer(('localhost', 8080), MyHandler)
# Prevent issues with socket reuse
server.allow_reuse_address = True
# Start the server
server.serve_forever()
To wszystko jest całkiem proste. Problemem, który napotykam, jest to, że ThreadingMixIn, ForkingMixIn lub w inny sposób żądanie zamyka blokowanie programu obsługi żądań w celu zwrócenia. Można to łatwo zobaczyć, implementując ten przykładowy kod:
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)
Gdyby serwer przetwarzał je jednocześnie, moglibyśmy wysłać dwa żądania i zobaczyć, jak serwer wchodzi do obu modułów obsługi żądań GET przed wysłaniem dowolnej odpowiedzi. Zamiast tego serwer wejdzie do obsługi żądań GET dla pierwszego żądania, poczeka na jego powrót, a następnie wprowadzi go na drugi (więc drugie żądanie potrzebuje ~ 20 sekund na powrót zamiast 10).
Czy mogę w prosty sposób zaimplementować system, w którym serwer nie czeka na powrót programu obsługi? W szczególności próbuję napisać system, który czeka na otrzymanie kilku żądań przed zwróceniem któregokolwiek z nich (forma długiego odpytywania) i na problemy, w których pierwsze żądanie oczekiwania blokuje wszelkie przyszłe żądania połączenia z serwerem.