python-http-server, mehrere gleichzeitige Anfragen

Entwickelt ich eine ziemlich umfangreiche http-server in python geschrieben unter Verwendung von tornado. Ohne Einstellung, nichts besonderes, blockiert der server auf Anfragen und können nur eine zu einem Zeitpunkt. Die Anforderungen im wesentlichen auf Daten zuzugreifen (mysql/redis) und drucken Sie es aus in json. Diese Anforderungen können nach oben zu nehmen von einer Sekunde auf die schlimmsten Fall. Das problem ist, dass eine Anfrage kommt, dass dauert eine lange Zeit (3s), dann eine einfache Anfrage kommt sofort nach, dass nehmen würde, 5ms zu behandeln. Auch da, die erste Anfrage wird noch ein 3s, der zweite startet erst, wenn die erste erledigt ist. So der zweite Antrag nimmt die >3s behandelt werden.

Wie kann ich diese situation besser? Ich brauche das zweite einfache Anfrage an die Ausführung beginnt unabhängig von anderen Anfragen. Ich bin neu in python und mehr Erfahrung mit apache/php, wo es keine Vorstellung von zwei getrennten requests blockieren sich gegenseitig. Ich habe mir in mod_python zu emulieren, die php-Beispiel, aber das scheint zu blockieren, sowie. Kann ich mein tornado-Servers, um die Funktionalität, die ich will? Überall lese ich, es sagt, dass der tornado ist Super im Umgang mit mehreren gleichzeitigen Anforderungen.

Ist hier der demo-code, mit dem ich arbeite. Ich habe einen sleep-Befehl ist, die ich verwende, um zu testen, ob die Parallelität funktioniert. Ist Schlaf eine faire Art und Weise zu testen Parallelität?

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()

Vielen Dank für jede Hilfe!!!

InformationsquelleAutor Landon | 2013-08-13
Schreibe einen Kommentar