Opracowałem dość rozbudowany serwer http napisany w Pythonie z wykorzystaniem tornada. Bez ustawienia niczego specjalnego, serwer blokuje żądania i może obsługiwać tylko jeden na raz. Żądania zasadniczo uzyskują dostęp do danych (mysql/redis) i wypisują je w json. W najgorszym przypadku żądania te mogą potrwać nawet do sekundy. Problem polega na tym, że pojawia się żądanie, które zajmuje dużo czasu (3s), a następnie proste żądanie przychodzi natychmiast po tym, że zajmie 5ms do obsługi. Cóż, skoro ta pierwsza prośba zajmie 3s, druga nie rozpocznie się, dopóki pierwsza nie zostanie wykonana. Tak więc druga prośba wymaga obsługi> 3s.Python serwer http, wiele jednoczesnych żądań
Jak mogę poprawić tę sytuację? Potrzebuję tego drugiego prostego żądania, aby rozpocząć wykonywanie, niezależnie od innych żądań. Jestem nowy w Pythonie i bardziej doświadczony w Apache/PHP, gdzie nie ma pojęcia, że dwa oddzielne żądania blokują się nawzajem. Zajrzałem do mod_python emulować przykład php, ale wydaje się, że również blokować. Czy mogę zmienić swój serwer tornado, aby uzyskać pożądaną funkcjonalność? Gdziekolwiek czytam, mówi, że tornado jest świetne w obsłudze wielu jednoczesnych żądań.
Oto kod demonstracyjny, nad którym pracuję. Mam polecenie sleep, którego używam do testowania, czy współbieżność działa. Czy sen jest dobrym sposobem na przetestowanie współbieżności?
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.gen
import time
class MainHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
@tornado.gen.engine
def handlePing1(self):
time.sleep(4)#simulating an expensive mysql call
self.write("response to browser ....")
self.finish()
def get(self):
start = time.time()
self.handlePing1()
#response = yield gen.Task(handlePing1)#i see tutorials around that suggest using something like this ....
print "done with request ...", self.request.path, round((time.time()-start),3)
application = tornado.web.Application([
(r"/.*", MainHandler),
])
if __name__ == "__main__":
http_server = tornado.httpserver.HTTPServer(application)
port=8833;
http_server.listen(port)
print "listening on "+str(port);
tornado.ioloop.IOLoop.instance().start()
Dzięki za pomoc!