今天,我想让一些同步Python库异步工作,但它不起作用。经过一系列测试后,我发现即使是yield tornado.gen.sleep(N)
也同步工作。为什么龙卷风异步不起作用
这里是我的代码:
import time
import tornado.web
import tornado.gen
import tornado.ioloop
import os
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.render("test.htm")
class SleepHandler(tornado.web.RequestHandler):
def get(self):
time.sleep(2)
self.write("Good morning!")
class YSleepHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
yield tornado.gen.sleep(2)
self.write("Good morning!")
def main():
app = tornado.web.Application([
(r"/sleep", SleepHandler),
(r"/ysleep", YSleepHandler),
(r"/", MainHandler),
], debug=True, template_path=os.path.split(
os.path.realpath(__file__))[0])
app.listen(8888)
try:
tornado.ioloop.IOLoop.current().start()
except:
tornado.ioloop.IOLoop.current().stop()
if __name__ == "__main__":
main()
我用下面的代码来测试异步函数工作或没有(在TEST.HTM - 为MainHandler模板文件):
for(var i = 0; i < 10; i++){
$.get("/sleep");
}
for(var i = 0; i < 10; i++){
$.get("/ysleep");
}
但最后,我得到了一个意想不到的result。
怎么回事?我在Python2.7和Python3.4环境下都尝试过。
这是一些浏览器的限制,他们不会打开多个连接到同一个URL。因此,在第一个代码示例中,浏览器实际上正在执行阻止。 –
是的,@AntBlackshaw是对的。看到[这个类似的问题](http://stackoverflow.com/questions/24106503/python-tornado-asynchronous-request-is-blocking) – dano