今天,我想讓一些同步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