我开发了一个相当庞大的http服务器,使用tornado编写,而没有设置任何特殊项,服务器在请求时会阻塞并且仅能一次处理一个请求。这些请求基本上访问数据(mysql/redis)并将其以json格式打印出来。在最坏情况下,这些请求可能需要超过一秒钟。问题是,第一个需要花费长时间(3秒)的请求到达后,紧随其后的容易处理的请求只需要5毫秒就可以完成处理。由于第一个请求需要3秒钟,所以第二个请求要等到第一个请求完成后才开始处理。因此,第二个请求需要> 3秒钟来处理。
如何使这种情况更好?我需要那个简单的第二个请求开始执行,而不管其他请求。我刚开始学习Python,并熟练掌握Apache/PHP,其中没有两个独立请求互相阻塞的概念。我尝试使用mod_python来模拟PHP示例,但似乎仍会出现阻塞现象。我是否可以更改我的tornado服务器以获取我想要的功能?无论我去哪里阅读,都说tornado很擅长处理多个同时的请求。
以下是我正在使用的演示代码。我有一个sleep命令,用它来测试并发性是否正确?
感谢您的任何帮助!
如何使这种情况更好?我需要那个简单的第二个请求开始执行,而不管其他请求。我刚开始学习Python,并熟练掌握Apache/PHP,其中没有两个独立请求互相阻塞的概念。我尝试使用mod_python来模拟PHP示例,但似乎仍会出现阻塞现象。我是否可以更改我的tornado服务器以获取我想要的功能?无论我去哪里阅读,都说tornado很擅长处理多个同时的请求。
以下是我正在使用的演示代码。我有一个sleep命令,用它来测试并发性是否正确?
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()
感谢您的任何帮助!