Ho sviluppato un server http piuttosto esteso scritto in python utilizzando il tornado. Senza impostare nulla di speciale, il server blocca le richieste e può gestirle solo una alla volta. Le richieste sostanzialmente accedono ai dati (mysql/redis) e li stampano in json. Queste richieste possono richiedere al massimo un secondo nel peggiore dei casi. Il problema è che arriva una richiesta che richiede molto tempo (3 secondi), quindi una richiesta facile arriva immediatamente dopo che richiederebbe 5 ms per gestire. Bene dal momento che quella prima richiesta prenderà 3 secondi, la seconda non inizierà fino a quando non verrà eseguita la prima. Quindi la seconda richiesta richiede> 3 s per essere gestita.server http python, più richieste simultanee
Come posso migliorare questa situazione? Ho bisogno di questa seconda semplice richiesta per iniziare l'esecuzione indipendentemente dalle altre richieste. Sono nuovo di Python, e più esperto con apache/php in cui non vi è alcuna nozione di due richieste separate che si bloccano a vicenda. Ho esaminato mod_python per emulare l'esempio di php, ma sembra che blocchi anche. Posso cambiare il mio server tornado per ottenere la funzionalità che voglio? Ovunque leggo, si dice che il tornado è ottimo per gestire più richieste simultanee.
Ecco il codice demo con cui sto lavorando. Ho un comando di sospensione che sto usando per verificare se la concorrenza funziona. Dormire è un modo giusto per testare la concorrenza?
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()
Grazie per qualsiasi aiuto!