我已经利用 tornado 开发了一个用 python 编写的相当广泛的 http 服务器。如果不进行任何特殊设置,服务器会阻塞请求并且一次只能处理一个。这些请求基本上是访问数据(mysql/redis)并以 json 格式打印出来。在最坏的情况下,这些请求可能需要一秒钟以上的时间。问题是一个请求进来需要很长时间(3 秒),然后一个简单的请求立即进来,需要 5 毫秒来处理。好吧,因为第一个请求需要 3 秒,所以第二个请求在第一个请求完成之前不会开始。所以第二个请求需要超过 3 秒的时间来处理。
我怎样才能使这种情况变得更好?无论其他请求如何,我都需要开始执行第二个简单请求。我是 python 新手,对 apache/php 更有经验,没有两个单独的请求相互阻塞的概念。我已经研究了 mod_python 来模拟 php 示例,但这似乎也被阻止了。我可以更改我的龙卷风服务器以获得我想要的功能吗?在我读到的所有地方,它都说龙卷风非常擅长处理多个同时请求。
这是我正在使用的演示代码。我有一个 sleep 命令,我用它来测试并发是否有效。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()
谢谢你的帮助!